gotthard2 with veto data on second interface

This commit is contained in:
maliakal_d 2020-05-13 17:50:18 +02:00
parent e730c124e3
commit eea67014b7
17 changed files with 455 additions and 379 deletions

View File

@ -2156,7 +2156,7 @@ void *start_timer(void *arg) {
sls_detector_header *header = sls_detector_header *header =
(sls_detector_header *)(packetData); (sls_detector_header *)(packetData);
header->detType = (uint16_t)myDetectorType; header->detType = (uint16_t)myDetectorType;
header->version = SLS_DETECTOR_HEADER_VERSION - 1; header->version = SLS_DETECTOR_HEADER_VERSION;
header->frameNumber = frameNr + iframes; header->frameNumber = frameNr + iframes;
header->packetNumber = i; header->packetNumber = i;
header->row = row; header->row = row;
@ -2166,7 +2166,7 @@ void *start_timer(void *arg) {
memset(packetData2, 0, packetsize); memset(packetData2, 0, packetsize);
header = (sls_detector_header *)(packetData2); header = (sls_detector_header *)(packetData2);
header->detType = (uint16_t)myDetectorType; header->detType = (uint16_t)myDetectorType;
header->version = SLS_DETECTOR_HEADER_VERSION - 1; header->version = SLS_DETECTOR_HEADER_VERSION;
header->frameNumber = frameNr + iframes; header->frameNumber = frameNr + iframes;
header->packetNumber = i; header->packetNumber = i;
header->row = row; header->row = row;

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
// clang-format off
#define REG_OFFSET (4) #define REG_OFFSET (4)
/* Base addresses 0x1804 0000 ---------------------------------------------*/ /* Base addresses 0x1804 0000 ---------------------------------------------*/
@ -37,6 +37,7 @@
/* UDP datagram generator */ /* UDP datagram generator */
#define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF #define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF
/* Clock Generation registers /* Clock Generation registers
* ------------------------------------------------------*/ * ------------------------------------------------------*/
#define PLL_RESET_REG (0x00 * REG_OFFSET + BASE_CLK_GENERATION) #define PLL_RESET_REG (0x00 * REG_OFFSET + BASE_CLK_GENERATION)
@ -68,8 +69,7 @@
#define API_VERSION_OFST (0) #define API_VERSION_OFST (0)
#define API_VERSION_MSK (0x00FFFFFF << API_VERSION_OFST) #define API_VERSION_MSK (0x00FFFFFF << API_VERSION_OFST)
#define API_VERSION_DETECTOR_TYPE_OFST (24) // Not used in software #define API_VERSION_DETECTOR_TYPE_OFST (24) // Not used in software
#define API_VERSION_DETECTOR_TYPE_MSK \ #define API_VERSION_DETECTOR_TYPE_MSK (0x000000FF << API_VERSION_DETECTOR_TYPE_OFST) // Not used in software
(0x000000FF << API_VERSION_DETECTOR_TYPE_OFST) // Not used in software
/* Fix pattern register */ /* Fix pattern register */
#define FIX_PATT_REG (0x03 * REG_OFFSET + BASE_CONTROL) #define FIX_PATT_REG (0x03 * REG_OFFSET + BASE_CONTROL)
@ -87,6 +87,9 @@
/* Config RW regiseter */ /* Config RW regiseter */
#define CONFIG_REG (0x20 * REG_OFFSET + BASE_CONTROL) #define CONFIG_REG (0x20 * REG_OFFSET + BASE_CONTROL)
#define CONFIG_VETO_ENBL_OFST (0)
#define CONFIG_VETO_ENBL_MSK (0x00000001 << CONFIG_VETO_ENBL_OFST)
/* Control RW register */ /* Control RW register */
#define CONTROL_REG (0x21 * REG_OFFSET + BASE_CONTROL) #define CONTROL_REG (0x21 * REG_OFFSET + BASE_CONTROL)
@ -101,8 +104,7 @@
#define CONTROL_CLR_ACQSTN_FIFO_OFST (15) #define CONTROL_CLR_ACQSTN_FIFO_OFST (15)
#define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST) #define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST)
#define CONTROL_TIMING_SOURCE_EXT_OFST (17) #define CONTROL_TIMING_SOURCE_EXT_OFST (17)
#define CONTROL_TIMING_SOURCE_EXT_MSK \ #define CONTROL_TIMING_SOURCE_EXT_MSK (0x00000001 << CONTROL_TIMING_SOURCE_EXT_OFST)
(0x00000001 << CONTROL_TIMING_SOURCE_EXT_OFST)
#define CONTROL_PWR_CHIP_OFST (31) #define CONTROL_PWR_CHIP_OFST (31)
#define CONTROL_PWR_CHIP_MSK (0x00000001 << CONTROL_PWR_CHIP_OFST) #define CONTROL_PWR_CHIP_MSK (0x00000001 << CONTROL_PWR_CHIP_OFST)
@ -116,25 +118,17 @@
#define ASIC_CONFIG_RUN_MODE_OFST (0) #define ASIC_CONFIG_RUN_MODE_OFST (0)
#define ASIC_CONFIG_RUN_MODE_MSK (0x00000003 << ASIC_CONFIG_RUN_MODE_OFST) #define ASIC_CONFIG_RUN_MODE_MSK (0x00000003 << ASIC_CONFIG_RUN_MODE_OFST)
#define ASIC_CONFIG_RUN_MODE_INT_BURST_VAL \ #define ASIC_CONFIG_RUN_MODE_INT_BURST_VAL ((0x1 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK)
((0x1 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK) #define ASIC_CONFIG_RUN_MODE_CONT_VAL ((0x2 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK)
#define ASIC_CONFIG_RUN_MODE_CONT_VAL \ #define ASIC_CONFIG_RUN_MODE_EXT_BURST_VAL ((0x3 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK)
((0x2 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK)
#define ASIC_CONFIG_RUN_MODE_EXT_BURST_VAL \
((0x3 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK)
#define ASIC_CONFIG_GAIN_OFST (4) #define ASIC_CONFIG_GAIN_OFST (4)
#define ASIC_CONFIG_GAIN_MSK (0x00000003 << ASIC_CONFIG_GAIN_OFST) #define ASIC_CONFIG_GAIN_MSK (0x00000003 << ASIC_CONFIG_GAIN_OFST)
#define ASIC_CONFIG_DYNAMIC_GAIN_VAL \ #define ASIC_CONFIG_DYNAMIC_GAIN_VAL ((0x0 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
((0x0 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK) #define ASIC_CONFIG_FIX_GAIN_1_VAL ((0x1 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_FIX_GAIN_1_VAL \ #define ASIC_CONFIG_FIX_GAIN_2_VAL ((0x2 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
((0x1 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK) #define ASIC_CONFIG_RESERVED_VAL ((0x3 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_FIX_GAIN_2_VAL \
((0x2 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_RESERVED_VAL \
((0x3 << ASIC_CONFIG_GAIN_OFST) & ASIC_CONFIG_GAIN_MSK)
#define ASIC_CONFIG_CURRENT_SRC_EN_OFST (7) #define ASIC_CONFIG_CURRENT_SRC_EN_OFST (7)
#define ASIC_CONFIG_CURRENT_SRC_EN_MSK \ #define ASIC_CONFIG_CURRENT_SRC_EN_MSK (0x00000001 << ASIC_CONFIG_CURRENT_SRC_EN_OFST)
(0x00000001 << ASIC_CONFIG_CURRENT_SRC_EN_OFST)
#define ASIC_CONFIG_RST_DAC_OFST (15) #define ASIC_CONFIG_RST_DAC_OFST (15)
#define ASIC_CONFIG_RST_DAC_MSK (0x00000001 << ASIC_CONFIG_RST_DAC_OFST) #define ASIC_CONFIG_RST_DAC_MSK (0x00000001 << ASIC_CONFIG_RST_DAC_OFST)
#define ASIC_CONFIG_DONE_OFST (31) #define ASIC_CONFIG_DONE_OFST (31)
@ -176,8 +170,7 @@
#define COORD_RESERVED_OFST (0) #define COORD_RESERVED_OFST (0)
#define COORD_RESERVED_MSK (0x0000FFFF << COORD_RESERVED_OFST) #define COORD_RESERVED_MSK (0x0000FFFF << COORD_RESERVED_OFST)
#define COORD_ID_OFST (16) // Not connected in firmware TODO #define COORD_ID_OFST (16) // Not connected in firmware TODO
#define COORD_ID_MSK \ #define COORD_ID_MSK (0x0000FFFF << COORD_ID_OFST) // Not connected in firmware TODO
(0x0000FFFF << COORD_ID_OFST) // Not connected in firmware TODO
/* Flow control registers --------------------------------------------------*/ /* Flow control registers --------------------------------------------------*/
@ -187,16 +180,13 @@
#define FLOW_STATUS_RUN_BUSY_OFST (0) #define FLOW_STATUS_RUN_BUSY_OFST (0)
#define FLOW_STATUS_RUN_BUSY_MSK (0x00000001 << FLOW_STATUS_RUN_BUSY_OFST) #define FLOW_STATUS_RUN_BUSY_MSK (0x00000001 << FLOW_STATUS_RUN_BUSY_OFST)
#define FLOW_STATUS_WAIT_FOR_TRGGR_OFST (3) #define FLOW_STATUS_WAIT_FOR_TRGGR_OFST (3)
#define FLOW_STATUS_WAIT_FOR_TRGGR_MSK \ #define FLOW_STATUS_WAIT_FOR_TRGGR_MSK (0x00000001 << FLOW_STATUS_WAIT_FOR_TRGGR_OFST)
(0x00000001 << FLOW_STATUS_WAIT_FOR_TRGGR_OFST)
#define FLOW_STATUS_DLY_BFRE_TRGGR_OFST (4) #define FLOW_STATUS_DLY_BFRE_TRGGR_OFST (4)
#define FLOW_STATUS_DLY_BFRE_TRGGR_MSK \ #define FLOW_STATUS_DLY_BFRE_TRGGR_MSK (0x00000001 << FLOW_STATUS_DLY_BFRE_TRGGR_OFST)
(0x00000001 << FLOW_STATUS_DLY_BFRE_TRGGR_OFST)
#define FLOW_STATUS_FIFO_FULL_OFST (5) #define FLOW_STATUS_FIFO_FULL_OFST (5)
#define FLOW_STATUS_FIFO_FULL_MSK (0x00000001 << FLOW_STATUS_FIFO_FULL_OFST) #define FLOW_STATUS_FIFO_FULL_MSK (0x00000001 << FLOW_STATUS_FIFO_FULL_OFST)
#define FLOW_STATUS_DLY_AFTR_TRGGR_OFST (15) #define FLOW_STATUS_DLY_AFTR_TRGGR_OFST (15)
#define FLOW_STATUS_DLY_AFTR_TRGGR_MSK \ #define FLOW_STATUS_DLY_AFTR_TRGGR_MSK (0x00000001 << FLOW_STATUS_DLY_AFTR_TRGGR_OFST)
(0x00000001 << FLOW_STATUS_DLY_AFTR_TRGGR_OFST)
#define FLOW_STATUS_CSM_BUSY_OFST (17) #define FLOW_STATUS_CSM_BUSY_OFST (17)
#define FLOW_STATUS_CSM_BUSY_MSK (0x00000001 << FLOW_STATUS_CSM_BUSY_OFST) #define FLOW_STATUS_CSM_BUSY_MSK (0x00000001 << FLOW_STATUS_CSM_BUSY_OFST)
@ -254,3 +244,10 @@
/* Trigger Delay 64 bit register */ /* Trigger Delay 64 bit register */
#define SET_TRIGGER_DELAY_LSB_REG (0x32 * REG_OFFSET + BASE_FLOW_CONTROL) #define SET_TRIGGER_DELAY_LSB_REG (0x32 * REG_OFFSET + BASE_FLOW_CONTROL)
#define SET_TRIGGER_DELAY_MSB_REG (0x33 * REG_OFFSET + BASE_FLOW_CONTROL) #define SET_TRIGGER_DELAY_MSB_REG (0x33 * REG_OFFSET + BASE_FLOW_CONTROL)
/* UDP datagram registers --------------------------------------------------*/
#define RXR_ENDPOINTS_MAX (32)
#define RXR_ENDPOINT_OFST (0x10)
// clang-format on

View File

@ -1290,44 +1290,42 @@ enum timingMode getTiming() {
return AUTO_TIMING; return AUTO_TIMING;
} }
int configureMAC() { /* configure mac */
void setNumberofUDPInterfaces(int val) {
uint32_t addr = CONFIG_REG;
uint32_t srcip = udpDetails.srcip; // 2 interfaces (enable veto)
uint32_t dstip = udpDetails.dstip; if (val > 1) {
uint64_t srcmac = udpDetails.srcmac; LOG(logINFOBLUE,
uint64_t dstmac = udpDetails.dstmac; ("Setting #Interfaces: 2 (enabling veto streaming)\n"));
int srcport = udpDetails.srcport; bus_w(addr, bus_r(addr) | CONFIG_VETO_ENBL_MSK);
int dstport = udpDetails.dstport;
LOG(logINFOBLUE, ("Configuring MAC\n"));
char src_mac[50], src_ip[INET_ADDRSTRLEN], dst_mac[50],
dst_ip[INET_ADDRSTRLEN];
getMacAddressinString(src_mac, 50, srcmac);
getMacAddressinString(dst_mac, 50, dstmac);
getIpAddressinString(src_ip, srcip);
getIpAddressinString(dst_ip, dstip);
LOG(logINFO, ("\tSource IP : %s\n"
"\tSource MAC : %s\n"
"\tSource Port : %d\n"
"\tDest IP : %s\n"
"\tDest MAC : %s\n"
"\tDest Port : %d\n",
src_ip, src_mac, srcport, dst_ip, dst_mac, dstport));
#ifdef VIRTUAL
if (setUDPDestinationDetails(0, dst_ip, dstport) == FAIL) {
LOG(logERROR, ("could not set udp destination IP and port\n"));
return FAIL;
} }
return OK; // 1 interface (disable veto)
#endif else {
LOG(logINFOBLUE,
("Setting #Interfaces: 1 (disabling veto streaming)\n"));
bus_w(addr, bus_r(addr) & ~CONFIG_VETO_ENBL_MSK);
}
LOG(logDEBUG, ("config reg:0x%x\n", bus_r(addr)));
}
int getNumberofUDPInterfaces() {
LOG(logDEBUG, ("config reg:0x%x\n", bus_r(CONFIG_REG)));
// return 2 if veto enabled, else 1
return ((bus_r(CONFIG_REG) & CONFIG_VETO_ENBL_MSK) ? 2 : 1);
}
void setupHeader(int iRxEntry, int vetoInterface, uint32_t destip,
uint64_t destmac, uint32_t destport, uint64_t sourcemac,
uint32_t sourceip, uint32_t sourceport) {
// start addr // start addr
uint32_t addr = BASE_UDP_RAM; uint32_t addr = BASE_UDP_RAM;
// calculate rxr endpoint offset // calculate rxr endpoint offset
// addr += (iRxEntry * RXR_ENDPOINT_OFST);//TODO: is there round robin if (vetoInterface == 1) {
// already implemented? iRxEntry += RXR_ENDPOINTS_MAX;
}
addr += (iRxEntry * RXR_ENDPOINT_OFST);
// get struct memory // get struct memory
udp_header *udp = udp_header *udp =
(udp_header *)(Nios_getBaseAddress() + addr / (sizeof(u_int32_t))); (udp_header *)(Nios_getBaseAddress() + addr / (sizeof(u_int32_t)));
@ -1335,21 +1333,21 @@ int configureMAC() {
// mac addresses // mac addresses
// msb (32) + lsb (16) // msb (32) + lsb (16)
udp->udp_destmac_msb = ((dstmac >> 16) & BIT32_MASK); udp->udp_destmac_msb = ((destmac >> 16) & BIT32_MASK);
udp->udp_destmac_lsb = ((dstmac >> 0) & BIT16_MASK); udp->udp_destmac_lsb = ((destmac >> 0) & BIT16_MASK);
// msb (16) + lsb (32) // msb (16) + lsb (32)
udp->udp_srcmac_msb = ((srcmac >> 32) & BIT16_MASK); udp->udp_srcmac_msb = ((sourcemac >> 32) & BIT16_MASK);
udp->udp_srcmac_lsb = ((srcmac >> 0) & BIT32_MASK); udp->udp_srcmac_lsb = ((sourcemac >> 0) & BIT32_MASK);
// ip addresses // ip addresses
udp->ip_srcip_msb = ((srcip >> 16) & BIT16_MASK); udp->ip_srcip_msb = ((sourceip >> 16) & BIT16_MASK);
udp->ip_srcip_lsb = ((srcip >> 0) & BIT16_MASK); udp->ip_srcip_lsb = ((sourceip >> 0) & BIT16_MASK);
udp->ip_destip_msb = ((dstip >> 16) & BIT16_MASK); udp->ip_destip_msb = ((destip >> 16) & BIT16_MASK);
udp->ip_destip_lsb = ((dstip >> 0) & BIT16_MASK); udp->ip_destip_lsb = ((destip >> 0) & BIT16_MASK);
// source port // source port
udp->udp_srcport = srcport; udp->udp_srcport = sourceport;
udp->udp_destport = dstport; udp->udp_destport = destport;
// other defines // other defines
udp->udp_ethertype = 0x800; udp->udp_ethertype = 0x800;
@ -1361,12 +1359,6 @@ int configureMAC() {
// total length is redefined in firmware // total length is redefined in firmware
calcChecksum(udp); calcChecksum(udp);
// TODO?
cleanFifos();
resetCore();
// alignDeserializer();
return OK;
} }
void calcChecksum(udp_header *udp) { void calcChecksum(udp_header *udp) {
@ -1401,6 +1393,88 @@ void calcChecksum(udp_header *udp) {
udp->ip_checksum = checksum; udp->ip_checksum = checksum;
} }
int configureMAC() {
uint32_t srcip = udpDetails.srcip;
uint32_t srcip2 = udpDetails.srcip2;
uint32_t dstip = udpDetails.dstip;
uint32_t dstip2 = udpDetails.dstip2;
uint64_t srcmac = udpDetails.srcmac;
uint64_t srcmac2 = udpDetails.srcmac2;
uint64_t dstmac = udpDetails.dstmac;
uint64_t dstmac2 = udpDetails.dstmac2;
int srcport = udpDetails.srcport;
int srcport2 = udpDetails.srcport2;
int dstport = udpDetails.dstport;
int dstport2 = udpDetails.dstport2;
LOG(logINFOBLUE, ("Configuring MAC\n"));
char src_mac[50], src_ip[INET_ADDRSTRLEN], dst_mac[50],
dst_ip[INET_ADDRSTRLEN];
getMacAddressinString(src_mac, 50, srcmac);
getMacAddressinString(dst_mac, 50, dstmac);
getIpAddressinString(src_ip, srcip);
getIpAddressinString(dst_ip, dstip);
char src_mac2[50], src_ip2[INET_ADDRSTRLEN], dst_mac2[50],
dst_ip2[INET_ADDRSTRLEN];
getMacAddressinString(src_mac2, 50, srcmac2);
getMacAddressinString(dst_mac2, 50, dstmac2);
getIpAddressinString(src_ip2, srcip2);
getIpAddressinString(dst_ip2, dstip2);
int numInterfaces = getNumberofUDPInterfaces();
LOG(logINFO, ("\t#Interfaces : %d\n", numInterfaces));
LOG(logINFO, ("\tData Interface \n"));
LOG(logINFO, ("\tSource IP : %s\n"
"\tSource MAC : %s\n"
"\tSource Port : %d\n"
"\tDest IP : %s\n"
"\tDest MAC : %s\n"
"\tDest Port : %d\n",
src_ip, src_mac, srcport, dst_ip, dst_mac, dstport));
LOG(logINFO, ("\tVeto Interface (%s)\n",
(numInterfaces == 2 ? "enabled" : "disabled")));
LOG(logINFO, ("\tSource IP2 : %s\n"
"\tSource MAC2 : %s\n"
"\tSource Port2: %d\n"
"\tDest IP2 : %s\n"
"\tDest MAC2 : %s\n"
"\tDest Port2 : %d\n",
src_ip2, src_mac2, srcport2, dst_ip2, dst_mac2, dstport2));
#ifdef VIRTUAL
if (setUDPDestinationDetails(0, dst_ip, dstport) == FAIL) {
LOG(logERROR, ("could not set udp destination IP and port\n"));
return FAIL;
}
if (numInterfaces == 2 &&
setUDPDestinationDetails(1, dst_ip2, dstport2) == FAIL) {
LOG(logERROR,
("could not set udp destination IP and port for interface 2\n"));
return FAIL;
}
return OK;
#endif
// default one rxr entry (others not yet implemented in client yet)
int iRxEntry = 0;
// data
setupHeader(iRxEntry, 0, dstip, dstmac, dstport, srcmac, srcip, srcport);
// veto
if (numInterfaces == 2) {
setupHeader(iRxEntry, 1, dstip2, dstmac2, dstport2, srcmac2, srcip2,
srcport2);
}
cleanFifos();
resetCore();
// alignDeserializer();
return OK;
}
int setDetectorPosition(int pos[]) { int setDetectorPosition(int pos[]) {
memcpy(detPos, pos, sizeof(detPos)); memcpy(detPos, pos, sizeof(detPos));
@ -2142,6 +2216,9 @@ int startStateMachine() {
if (createUDPSocket(0) != OK) { if (createUDPSocket(0) != OK) {
return FAIL; return FAIL;
} }
if (getNumberofUDPInterfaces() == 2 && createUDPSocket(1) != OK) {
return FAIL;
}
LOG(logINFOBLUE, ("Starting State Machine\n")); LOG(logINFOBLUE, ("Starting State Machine\n"));
// set status to running // set status to running
virtual_status = 1; virtual_status = 1;
@ -2181,6 +2258,7 @@ void *start_timer(void *arg) {
return NULL; return NULL;
} }
int numInterfaces = getNumberofUDPInterfaces();
int numRepeats = getNumTriggers(); int numRepeats = getNumTriggers();
if (getTiming() == AUTO_TIMING) { if (getTiming() == AUTO_TIMING) {
if (burstMode == BURST_OFF) { if (burstMode == BURST_OFF) {
@ -2196,6 +2274,8 @@ void *start_timer(void *arg) {
int imagesize = NCHAN * NCHIP * 2; int imagesize = NCHAN * NCHIP * 2;
int datasize = imagesize; int datasize = imagesize;
int packetsize = datasize + sizeof(sls_detector_header); int packetsize = datasize + sizeof(sls_detector_header);
int vetodatasize = VETO_DATA_SIZE;
int vetopacketsize = vetodatasize + sizeof(sls_detector_header);
// Generate data // Generate data
char imageData[imagesize]; char imageData[imagesize];
@ -2203,6 +2283,11 @@ void *start_timer(void *arg) {
for (int i = 0; i < imagesize; i += sizeof(uint16_t)) { for (int i = 0; i < imagesize; i += sizeof(uint16_t)) {
*((uint16_t *)(imageData + i)) = i; *((uint16_t *)(imageData + i)) = i;
} }
char vetoData[vetodatasize];
memset(vetoData, 0, sizeof(vetodatasize));
for (int i = 0; i < vetodatasize; i += sizeof(uint8_t)) {
*((uint16_t *)(vetoData + i)) = i;
}
{ {
int frameHeaderNr = 0; int frameHeaderNr = 0;
@ -2227,6 +2312,7 @@ void *start_timer(void *arg) {
clock_gettime(CLOCK_REALTIME, &begin); clock_gettime(CLOCK_REALTIME, &begin);
usleep(expUs); usleep(expUs);
// first interface
char packetData[packetsize]; char packetData[packetsize];
memset(packetData, 0, packetsize); memset(packetData, 0, packetsize);
// set header // set header
@ -2235,19 +2321,38 @@ void *start_timer(void *arg) {
header->detType = (uint16_t)myDetectorType; header->detType = (uint16_t)myDetectorType;
header->version = SLS_DETECTOR_HEADER_VERSION - 1; header->version = SLS_DETECTOR_HEADER_VERSION - 1;
header->frameNumber = frameHeaderNr; header->frameNumber = frameHeaderNr;
++frameHeaderNr;
header->packetNumber = 0; header->packetNumber = 0;
header->modId = 0; header->modId = 0;
header->row = detPos[X]; header->row = detPos[X];
header->column = detPos[Y]; header->column = detPos[Y];
// fill data // fill data
memcpy(packetData + sizeof(sls_detector_header), imageData, memcpy(packetData + sizeof(sls_detector_header), imageData,
datasize); datasize);
// send 1 packet = 1 frame // send 1 packet = 1 frame
sendUDPPacket(0, packetData, packetsize); sendUDPPacket(0, packetData, packetsize);
// second interface (veto)
char packetData2[packetsize];
memset(packetData2, 0, packetsize);
if (numInterfaces == 2) {
// set header
sls_detector_header *header =
(sls_detector_header *)(packetData2);
header->detType = (uint16_t)myDetectorType;
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
header->frameNumber = frameHeaderNr;
header->packetNumber = 0;
header->modId = 0;
header->row = detPos[X];
header->column = detPos[Y];
// fill data
memcpy(packetData2 + sizeof(sls_detector_header), vetoData,
vetodatasize);
// send 1 packet = 1 frame
sendUDPPacket(1, packetData2, vetopacketsize);
}
++frameHeaderNr;
clock_gettime(CLOCK_REALTIME, &end); clock_gettime(CLOCK_REALTIME, &end);
LOG(logINFO, LOG(logINFO,
("Sent frame: %d (bursts: %d)\n", frameNr, repeatNr)); ("Sent frame: %d (bursts: %d)\n", frameNr, repeatNr));
@ -2275,6 +2380,9 @@ void *start_timer(void *arg) {
} }
closeUDPSocket(0); closeUDPSocket(0);
if (numInterfaces == 2) {
closeUDPSocket(1);
}
virtual_status = 0; virtual_status = 0;
if (isControlServer) { if (isControlServer) {

View File

@ -52,12 +52,11 @@
#define DEFAULT_SYSTEM_C3 (5) //(144444448) // str_clk, 144 MHz #define DEFAULT_SYSTEM_C3 (5) //(144444448) // str_clk, 144 MHz
/* Firmware Definitions */ /* Firmware Definitions */
#define IP_HEADER_SIZE (20)
#define FIXED_PLL_FREQUENCY (20000000) // 20MHz #define FIXED_PLL_FREQUENCY (20000000) // 20MHz
#define INT_SYSTEM_C0_FREQUENCY (144000000) // 144 MHz #define INT_SYSTEM_C0_FREQUENCY (144000000) // 144 MHz
#define READOUT_PLL_VCO_FREQ_HZ (866666688) // 866 MHz #define READOUT_PLL_VCO_FREQ_HZ (866666688) // 866 MHz
#define SYSTEM_PLL_VCO_FREQ_HZ (722222224) // 722 MHz #define SYSTEM_PLL_VCO_FREQ_HZ (722222224) // 722 MHz
#define VETO_DATA_SIZE (160)
/** Other Definitions */ /** Other Definitions */
#define BIT16_MASK (0xFFFF) #define BIT16_MASK (0xFFFF)
@ -156,4 +155,5 @@ typedef struct udp_header_struct {
uint16_t udp_checksum; uint16_t udp_checksum;
uint16_t udp_destport; uint16_t udp_destport;
} udp_header; } udp_header;
#define IP_HEADER_SIZE (20)
#define UDP_IP_HEADER_LENGTH_BYTES (28) #define UDP_IP_HEADER_LENGTH_BYTES (28)

View File

@ -46,7 +46,6 @@ int highvoltage = 0;
int dacValues[NDAC] = {}; int dacValues[NDAC] = {};
int32_t clkPhase[NUM_CLOCKS] = {}; int32_t clkPhase[NUM_CLOCKS] = {};
int detPos[4] = {}; int detPos[4] = {};
int numUDPInterfaces = 1;
int isInitCheckDone() { return initCheckDone; } int isInitCheckDone() { return initCheckDone; }

View File

@ -329,9 +329,12 @@ int getExtSignal();
// configure mac // configure mac
#ifdef GOTTHARDD #ifdef GOTTHARDD
void calcChecksum(mac_conf *mac, int sourceip, int destip); void calcChecksum(mac_conf *mac, int sourceip, int destip);
#elif JUNGFRAUD #endif
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
void setNumberofUDPInterfaces(int val); void setNumberofUDPInterfaces(int val);
int getNumberofUDPInterfaces(); int getNumberofUDPInterfaces();
#endif
#ifdef JUNGFRAUD
void selectPrimaryInterface(int val); void selectPrimaryInterface(int val);
int getPrimaryInterface(); int getPrimaryInterface();
void setupHeader(int iRxEntry, enum interfaceType type, uint32_t destip, void setupHeader(int iRxEntry, enum interfaceType type, uint32_t destip,

View File

@ -5041,6 +5041,7 @@ void calculate_and_set_position() {
return; return;
} }
int maxy = maxydet; int maxy = maxydet;
// position does not change for gotthard2 (2 interfaces)
#ifdef JUNGFRAUD #ifdef JUNGFRAUD
maxy *= getNumberofUDPInterfaces(); maxy *= getNumberofUDPInterfaces();
#endif #endif
@ -5076,7 +5077,7 @@ void calculate_and_set_position() {
udpDetails.srcmac = (udpDetails.srcmac << 8) + a[i]; udpDetails.srcmac = (udpDetails.srcmac << 8) + a[i];
} }
} }
#ifdef JUNGFRAUD #if defined(JUNGFRAUD) || defined(GOTTHARD2D)
if (getNumberofUDPInterfaces() > 1) { if (getNumberofUDPInterfaces() > 1) {
if (udpDetails.srcmac2 == 0) { if (udpDetails.srcmac2 == 0) {
char dmac2[50]; char dmac2[50];
@ -5154,7 +5155,7 @@ int is_configurable() {
LOG(logWARNING, ("%s", configureMessage)); LOG(logWARNING, ("%s", configureMessage));
return FAIL; return FAIL;
} }
#ifdef JUNGFRAUD #if defined(JUNGFRAUD) || defined(GOTTHARD2D)
if (getNumberofUDPInterfaces() == 2) { if (getNumberofUDPInterfaces() == 2) {
if (udpDetails.srcip2 == 0) { if (udpDetails.srcip2 == 0) {
strcpy(configureMessage, "udp source ip2 not configured\n"); strcpy(configureMessage, "udp source ip2 not configured\n");
@ -5253,7 +5254,7 @@ int set_source_udp_ip2(int file_des) {
arg = __builtin_bswap32(arg); arg = __builtin_bswap32(arg);
LOG(logINFO, ("Setting udp source ip2: 0x%x\n", arg)); LOG(logINFO, ("Setting udp source ip2: 0x%x\n", arg));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// only set // only set
@ -5275,7 +5276,7 @@ int get_source_udp_ip2(int file_des) {
uint32_t retval = -1; uint32_t retval = -1;
LOG(logDEBUG1, ("Getting udp source ip2\n")); LOG(logDEBUG1, ("Getting udp source ip2\n"));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// get only // get only
@ -5332,7 +5333,7 @@ int set_dest_udp_ip2(int file_des) {
arg = __builtin_bswap32(arg); arg = __builtin_bswap32(arg);
LOG(logINFO, ("Setting udp destination ip2: 0x%x\n", arg)); LOG(logINFO, ("Setting udp destination ip2: 0x%x\n", arg));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// only set // only set
@ -5354,7 +5355,7 @@ int get_dest_udp_ip2(int file_des) {
uint32_t retval = -1; uint32_t retval = -1;
LOG(logDEBUG1, ("Getting udp destination ip2\n")); LOG(logDEBUG1, ("Getting udp destination ip2\n"));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// get only // get only
@ -5408,7 +5409,7 @@ int set_source_udp_mac2(int file_des) {
return printSocketReadError(); return printSocketReadError();
LOG(logINFO, ("Setting udp source mac2: 0x%lx\n", arg)); LOG(logINFO, ("Setting udp source mac2: 0x%lx\n", arg));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// only set // only set
@ -5430,7 +5431,7 @@ int get_source_udp_mac2(int file_des) {
uint64_t retval = -1; uint64_t retval = -1;
LOG(logDEBUG1, ("Getting udp source mac2\n")); LOG(logDEBUG1, ("Getting udp source mac2\n"));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// get only // get only
@ -5483,7 +5484,7 @@ int set_dest_udp_mac2(int file_des) {
return printSocketReadError(); return printSocketReadError();
LOG(logINFO, ("Setting udp destination mac2: 0x%lx\n", arg)); LOG(logINFO, ("Setting udp destination mac2: 0x%lx\n", arg));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// only set // only set
@ -5505,7 +5506,7 @@ int get_dest_udp_mac2(int file_des) {
uint64_t retval = -1; uint64_t retval = -1;
LOG(logDEBUG1, ("Getting udp destination mac2\n")); LOG(logDEBUG1, ("Getting udp destination mac2\n"));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// get only // get only
@ -5558,7 +5559,7 @@ int set_dest_udp_port2(int file_des) {
return printSocketReadError(); return printSocketReadError();
LOG(logINFO, ("Setting udp destination port2: %u\n", arg)); LOG(logINFO, ("Setting udp destination port2: %u\n", arg));
#if !defined(JUNGFRAUD) && !defined(EIGERD) #if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// only set // only set
@ -5580,7 +5581,7 @@ int get_dest_udp_port2(int file_des) {
int retval = -1; int retval = -1;
LOG(logDEBUG1, ("Getting destination port2\n")); LOG(logDEBUG1, ("Getting destination port2\n"));
#if !defined(JUNGFRAUD) && !defined(EIGERD) #if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// get only // get only
@ -5599,7 +5600,7 @@ int set_num_interfaces(int file_des) {
return printSocketReadError(); return printSocketReadError();
LOG(logINFO, ("Setting number of interfaces: %d\n", arg)); LOG(logINFO, ("Setting number of interfaces: %d\n", arg));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
functionNotImplemented(); functionNotImplemented();
#else #else
// only set // only set
@ -5627,7 +5628,7 @@ int get_num_interfaces(int file_des) {
int retval = -1; int retval = -1;
LOG(logDEBUG1, ("Getting number of udp interfaces\n")); LOG(logDEBUG1, ("Getting number of udp interfaces\n"));
#ifndef JUNGFRAUD #if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
retval = 1; retval = 1;
#else #else
// get only // get only
@ -7156,7 +7157,7 @@ int get_receiver_parameters(int file_des) {
// sending real detector parameters // sending real detector parameters
// udp interfaces // udp interfaces
#ifdef JUNGFRAUD #if defined(JUNGFRAUD) || defined(GOTTHARD2D)
i32 = getNumberofUDPInterfaces(); i32 = getNumberofUDPInterfaces();
#else #else
i32 = 1; i32 = 1;

View File

@ -379,10 +379,13 @@ class Detector {
* * * *
* ************************************************/ * ************************************************/
/** [Jungfrau] */ /** [Jungfrau][Gotthard2] */
Result<int> getNumberofUDPInterfaces(Positions pos = {}) const; Result<int> getNumberofUDPInterfaces(Positions pos = {}) const;
/** [Jungfrau] Also restarts client and receiver sockets */ /** [Jungfrau][Gotthard2] Also restarts client and receiver zmq sockets
* [Gotthard2] second interface enabled to send veto information for
* debugging
* n can be 1 or 2 */
void setNumberofUDPInterfaces(int n, Positions pos = {}); void setNumberofUDPInterfaces(int n, Positions pos = {});
/** [Jungfrau] */ /** [Jungfrau] */

View File

@ -1517,10 +1517,13 @@ class CmdProxy {
/* Network Configuration (Detector<->Receiver) */ /* Network Configuration (Detector<->Receiver) */
INTEGER_COMMAND(numinterfaces, getNumberofUDPInterfaces, INTEGER_COMMAND(
setNumberofUDPInterfaces, StringTo<int>, numinterfaces, getNumberofUDPInterfaces, setNumberofUDPInterfaces,
"[1, 2]\n\t[Jungfrau] Number of udp interfaces to stream " StringTo<int>,
"data from detector. Default: 1."); "[1, 2]\n\t[Jungfrau][Gotthard2] Number of udp interfaces to stream "
"data from detector. Default: 1.\n\t"
"[Gotthard2] Second interface enabled to send veto information for "
"debugging.");
INTEGER_COMMAND( INTEGER_COMMAND(
selinterface, getSelectedUDPInterface, selectUDPInterface, selinterface, getSelectedUDPInterface, selectUDPInterface,

View File

@ -383,9 +383,13 @@ int DetectorImpl::createReceivingDataSockets(const bool destroy) {
if (multi_shm()->multiDetectorType == EIGER) { if (multi_shm()->multiDetectorType == EIGER) {
numSocketsPerDetector = 2; numSocketsPerDetector = 2;
} }
if (Parallel(&Module::getNumberofUDPInterfacesFromShm, {}).squash() == 2) { // gotthard2 second interface is only for veto debugging
else if (multi_shm()->multiDetectorType != GOTTHARD2) {
if (Parallel(&Module::getNumberofUDPInterfacesFromShm, {}).squash() ==
2) {
numSocketsPerDetector = 2; numSocketsPerDetector = 2;
} }
}
numSockets *= numSocketsPerDetector; numSockets *= numSocketsPerDetector;
for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) { for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) {
@ -424,9 +428,12 @@ void DetectorImpl::readFrameFromReceiver() {
int nDetPixelsY = 0; int nDetPixelsY = 0;
bool quadEnable = false; bool quadEnable = false;
bool eiger = false; bool eiger = false;
bool numInterfaces = Parallel(&Module::getNumberofUDPInterfacesFromShm, {}) bool numInterfaces = 1;
// gotthard2 second interface is veto debugging
if (multi_shm()->multiDetectorType != GOTTHARD2) {
numInterfaces = Parallel(&Module::getNumberofUDPInterfacesFromShm, {})
.squash(); // cannot pick up from zmq .squash(); // cannot pick up from zmq
}
bool runningList[zmqSocket.size()], connectList[zmqSocket.size()]; bool runningList[zmqSocket.size()], connectList[zmqSocket.size()];
int numRunning = 0; int numRunning = 0;
for (size_t i = 0; i < zmqSocket.size(); ++i) { for (size_t i = 0; i < zmqSocket.size(); ++i) {

View File

@ -780,12 +780,7 @@ class Module : public virtual slsDetectorDefs {
*/ */
int getDestinationUDPPort2(); int getDestinationUDPPort2();
/** /** [Jungfrau][Gotthard2] */
* Sets the number of UDP interfaces to stream data from detector (Jungfrau
* only)
* @param n number of interfaces. Options 1 or 2.
* @returns the number of interface
*/
void setNumberofUDPInterfaces(int n); void setNumberofUDPInterfaces(int n);
/** Returns the number of udp interfaces from shared memory */ /** Returns the number of udp interfaces from shared memory */

View File

@ -394,7 +394,7 @@ int ClientInterface::setup_receiver(Interface &socket) {
} }
impl()->setUDPPortNumber(arg.udp_dstport); impl()->setUDPPortNumber(arg.udp_dstport);
impl()->setUDPPortNumber2(arg.udp_dstport2); impl()->setUDPPortNumber2(arg.udp_dstport2);
if (myDetectorType == JUNGFRAU) { if (myDetectorType == JUNGFRAU || myDetectorType == GOTTHARD2) {
try { try {
impl()->setNumberofUDPInterfaces(arg.udpInterfaces); impl()->setNumberofUDPInterfaces(arg.udpInterfaces);
} catch (const RuntimeError &e) { } catch (const RuntimeError &e) {
@ -1531,7 +1531,7 @@ sls::MacAddr ClientInterface::setUdpIp2(sls::IpAddr arg) {
int ClientInterface::set_udp_ip2(Interface &socket) { int ClientInterface::set_udp_ip2(Interface &socket) {
auto arg = socket.Receive<sls::IpAddr>(); auto arg = socket.Receive<sls::IpAddr>();
verifyIdle(socket); verifyIdle(socket);
if (myDetectorType != JUNGFRAU) { if (myDetectorType != JUNGFRAU && myDetectorType != GOTTHARD2) {
throw RuntimeError( throw RuntimeError(
"UDP Destination IP2 not implemented for this detector"); "UDP Destination IP2 not implemented for this detector");
} }
@ -1552,7 +1552,8 @@ int ClientInterface::set_udp_port(Interface &socket) {
int ClientInterface::set_udp_port2(Interface &socket) { int ClientInterface::set_udp_port2(Interface &socket) {
auto arg = socket.Receive<int>(); auto arg = socket.Receive<int>();
verifyIdle(socket); verifyIdle(socket);
if (myDetectorType != JUNGFRAU && myDetectorType != EIGER) { if (myDetectorType != JUNGFRAU && myDetectorType != EIGER &&
myDetectorType != GOTTHARD2) {
throw RuntimeError( throw RuntimeError(
"UDP Destination Port2 not implemented for this detector"); "UDP Destination Port2 not implemented for this detector");
} }
@ -1565,7 +1566,7 @@ int ClientInterface::set_num_interfaces(Interface &socket) {
auto arg = socket.Receive<int>(); auto arg = socket.Receive<int>();
arg = (arg > 1 ? 2 : 1); arg = (arg > 1 ? 2 : 1);
verifyIdle(socket); verifyIdle(socket);
if (myDetectorType != JUNGFRAU) { if (myDetectorType != JUNGFRAU && myDetectorType != GOTTHARD2) {
throw RuntimeError( throw RuntimeError(
"Number of interfaces not implemented for this detector"); "Number of interfaces not implemented for this detector");
} }

View File

@ -74,7 +74,6 @@ void DataProcessor::RecordFirstIndex(uint64_t fnum) {
void DataProcessor::SetGeneralData(GeneralData *g) { void DataProcessor::SetGeneralData(GeneralData *g) {
generalData = g; generalData = g;
generalData->Print();
if (file != nullptr) { if (file != nullptr) {
if (file->GetFileType() == HDF5) { if (file->GetFileType() == HDF5) {
file->SetNumberofPixels(generalData->nPixelsX, file->SetNumberofPixels(generalData->nPixelsX,
@ -352,6 +351,9 @@ void DataProcessor::PadMissingPackets(char *buf) {
sls_bitset pmask = header->packetsMask; sls_bitset pmask = header->packetsMask;
uint32_t dsize = generalData->dataSize; uint32_t dsize = generalData->dataSize;
if (myDetectorType == GOTTHARD2 && index != 0) {
dsize = generalData->vetoDataSize;
}
uint32_t fifohsize = generalData->fifoBufferHeaderSize; uint32_t fifohsize = generalData->fifoBufferHeaderSize;
uint32_t corrected_dsize = uint32_t corrected_dsize =
dsize - ((pperFrame * dsize) - generalData->imageSize); dsize - ((pperFrame * dsize) - generalData->imageSize);

View File

@ -41,10 +41,8 @@ void DataStreamer::ResetParametersforNewAcquisition(const std::string &fname) {
delete[] completeBuffer; delete[] completeBuffer;
completeBuffer = nullptr; completeBuffer = nullptr;
} }
if (roi->xmin != -1) { if (generalData->myDetectorType == GOTTHARD && roi->xmin != -1) {
if (generalData->myDetectorType == GOTTHARD) {
adcConfigured = generalData->GetAdcConfigured(index, *roi); adcConfigured = generalData->GetAdcConfigured(index, *roi);
}
completeBuffer = new char[generalData->imageSizeComplete]; completeBuffer = new char[generalData->imageSizeComplete];
memset(completeBuffer, 0, generalData->imageSizeComplete); memset(completeBuffer, 0, generalData->imageSizeComplete);
} }
@ -57,10 +55,7 @@ void DataStreamer::RecordFirstIndex(uint64_t fnum) {
LOG(logDEBUG1) << index << " First Index: " << firstIndex; LOG(logDEBUG1) << index << " First Index: " << firstIndex;
} }
void DataStreamer::SetGeneralData(GeneralData *g) { void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; }
generalData = g;
generalData->Print();
}
void DataStreamer::SetNumberofDetectors(int *nd) { void DataStreamer::SetNumberofDetectors(int *nd) {
numDet[0] = nd[0]; numDet[0] = nd[0];
@ -147,7 +142,6 @@ void DataStreamer::ProcessAnImage(char *buf) {
// shortframe gotthard // shortframe gotthard
if (completeBuffer) { if (completeBuffer) {
// disregarding the size modified from callback (always using // disregarding the size modified from callback (always using
// imageSizeComplete // imageSizeComplete
// instead of buf (32 bit) because gui needs imagesizecomplete and // instead of buf (32 bit) because gui needs imagesizecomplete and

View File

@ -17,86 +17,41 @@
class GeneralData { class GeneralData {
public: public:
/** DetectorType */ slsDetectorDefs::detectorType myDetectorType{slsDetectorDefs::GENERIC};
slsDetectorDefs::detectorType myDetectorType; uint32_t nPixelsX{0};
uint32_t nPixelsY{0};
/** Number of Pixels in x axis */ uint32_t headerSizeinPacket{0};
uint32_t nPixelsX;
/** Number of Pixels in y axis */
uint32_t nPixelsY;
/** Size of header in Packet */
uint32_t headerSizeinPacket;
/** Size of just data in 1 packet (in bytes) */ /** Size of just data in 1 packet (in bytes) */
uint32_t dataSize; uint32_t dataSize{0};
uint32_t packetSize{0};
/** Size of 1 packet (in bytes) */
uint32_t packetSize;
/** Number of packets in an image (for each listening UDP port) */ /** Number of packets in an image (for each listening UDP port) */
uint32_t packetsPerFrame; uint32_t packetsPerFrame{0};
/** Image size (in bytes, for each listening UDP port) */ /** Image size (in bytes, for each listening UDP port) */
uint32_t imageSize; uint32_t imageSize{0};
uint64_t frameIndexMask{0};
/** Frame Number Mask */ uint32_t frameIndexOffset{0};
uint64_t frameIndexMask; uint32_t packetIndexMask{0};
uint32_t packetIndexOffset{0};
/** Frame Index Offset */ uint32_t maxFramesPerFile{0};
uint32_t frameIndexOffset;
/** Packet Index Mask */
uint32_t packetIndexMask;
/** Packet Index Offset */
uint32_t packetIndexOffset;
/** Max Frames per binary file */
uint32_t maxFramesPerFile;
/** Header size of data saved into fifo buffer at a time*/ /** Header size of data saved into fifo buffer at a time*/
uint32_t fifoBufferHeaderSize; uint32_t fifoBufferHeaderSize{0};
uint32_t defaultFifoDepth{0};
/** Default Fifo depth */ uint32_t threadsPerReceiver{1};
uint32_t defaultFifoDepth; uint32_t headerPacketSize{0};
/** Streaming (for ROI - mainly short Gotthard) */
/** Threads per receiver */ uint32_t nPixelsXComplete{0};
uint32_t threadsPerReceiver; /** Streaming (for ROI - mainly short Gotthard) */
uint32_t nPixelsYComplete{0};
/** Size of a header packet */
uint32_t headerPacketSize;
/** Streaming (for ROI - mainly short Gotthard) - Number of Pixels in x axis
*/
uint32_t nPixelsXComplete;
/** Streaming (for ROI - mainly short Gotthard) - Number of Pixels in y axis
*/
uint32_t nPixelsYComplete;
/** Streaming (for ROI - mainly short Gotthard) - Image size (in bytes) */ /** Streaming (for ROI - mainly short Gotthard) - Image size (in bytes) */
uint32_t imageSizeComplete; uint32_t imageSizeComplete{0};
/** if standard header implemented in firmware */ /** if standard header implemented in firmware */
bool standardheader; bool standardheader{false};
uint32_t defaultUdpSocketBufferSize{RECEIVE_SOCKET_BUFFER_SIZE};
uint32_t vetoDataSize{0};
uint32_t vetoPacketSize{0};
uint32_t vetoImageSize{0};
/** default udp socket buffer size */ GeneralData(){};
uint32_t defaultUdpSocketBufferSize;
/** Cosntructor */
GeneralData()
: myDetectorType(slsDetectorDefs::GENERIC), nPixelsX(0), nPixelsY(0),
headerSizeinPacket(0), dataSize(0), packetSize(0), packetsPerFrame(0),
imageSize(0), frameIndexMask(0), frameIndexOffset(0),
packetIndexMask(0), packetIndexOffset(0), maxFramesPerFile(0),
fifoBufferHeaderSize(0), defaultFifoDepth(0), threadsPerReceiver(1),
headerPacketSize(0), nPixelsXComplete(0), nPixelsYComplete(0),
imageSizeComplete(0), standardheader(false),
defaultUdpSocketBufferSize(RECEIVE_SOCKET_BUFFER_SIZE){};
/** Destructor */
virtual ~GeneralData(){}; virtual ~GeneralData(){};
/** /**
@ -203,35 +158,6 @@ class GeneralData {
LOG(logERROR) << "SetNumberofCounters is a generic function that " LOG(logERROR) << "SetNumberofCounters is a generic function that "
"should be overloaded by a derived class"; "should be overloaded by a derived class";
} }
/**
* Print all variables
*/
virtual void Print(TLogLevel level = logDEBUG1) const {
LOG(level) << "\n\nDetector Data Variables:";
LOG(level) << "myDetectorType: " << sls::ToString(myDetectorType);
LOG(level) << "Pixels X: " << nPixelsX;
LOG(level) << "Pixels Y: " << nPixelsY;
LOG(level) << "Header Size in Packet: " << headerSizeinPacket;
LOG(level) << "Data Size: " << dataSize;
LOG(level) << "Packet Size: " << packetSize;
LOG(level) << "Packets per Frame: " << packetsPerFrame;
LOG(level) << "Image Size: " << imageSize;
LOG(level) << "Frame Index Mask: " << frameIndexMask;
LOG(level) << "Frame Index Offset: " << frameIndexOffset;
LOG(level) << "Packet Index Mask: " << packetIndexMask;
LOG(level) << "Packet Index Offset: " << packetIndexOffset;
LOG(level) << "Max Frames Per File: " << maxFramesPerFile;
LOG(level) << "Fifo Buffer Header Size: " << fifoBufferHeaderSize;
LOG(level) << "Default Fifo Depth: " << defaultFifoDepth;
LOG(level) << "Threads Per Receiver: " << threadsPerReceiver;
LOG(level) << "Header Packet Size: " << headerPacketSize;
LOG(level) << "Complete Pixels X: " << nPixelsXComplete;
LOG(level) << "Complete Pixels Y: " << nPixelsYComplete;
LOG(level) << "Complete Image Size: " << imageSizeComplete;
LOG(level) << "Standard Header: " << standardheader;
LOG(level) << "UDP Socket Buffer Size: " << defaultUdpSocketBufferSize;
};
}; };
class GotthardData : public GeneralData { class GotthardData : public GeneralData {
@ -475,7 +401,7 @@ class JungfrauData : public GeneralData {
threadsPerReceiver = 1; threadsPerReceiver = 1;
defaultUdpSocketBufferSize = (1000 * 1024 * 1024); defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
} }
} };
}; };
class Mythen3Data : public GeneralData { class Mythen3Data : public GeneralData {
@ -561,6 +487,24 @@ class Gotthard2Data : public GeneralData {
defaultFifoDepth = 50000; defaultFifoDepth = 50000;
standardheader = true; standardheader = true;
defaultUdpSocketBufferSize = (1000 * 1024 * 1024); defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
vetoDataSize = 160;
vetoPacketSize = headerSizeinPacket + vetoDataSize;
vetoImageSize = vetoDataSize * packetsPerFrame;
};
/**
* set number of interfaces
* @param number of interfaces
*/
void SetNumberofInterfaces(const int n) {
// 2 interfaces (+veto)
if (n == 2) {
threadsPerReceiver = 2;
}
// 1 interface (data only)
else {
threadsPerReceiver = 1;
}
}; };
}; };

View File

@ -178,13 +178,16 @@ void Implementation::SetupFifoStructure() {
fifo.clear(); fifo.clear();
for (int i = 0; i < numThreads; ++i) { for (int i = 0; i < numThreads; ++i) {
uint32_t datasize = generalData->imageSize;
// veto data size
if (myDetectorType == GOTTHARD2 && i != 0) {
datasize = generalData->vetoImageSize;
}
// create fifo structure // create fifo structure
try { try {
fifo.push_back(sls::make_unique<Fifo>( fifo.push_back(sls::make_unique<Fifo>(
i, i, datasize + (generalData->fifoBufferHeaderSize), fifoDepth));
(generalData->imageSize) + (generalData->fifoBufferHeaderSize),
fifoDepth));
} catch (...) { } catch (...) {
fifo.clear(); fifo.clear();
fifoDepth = 0; fifoDepth = 0;
@ -199,14 +202,15 @@ void Implementation::SetupFifoStructure() {
dataProcessor[i]->SetFifo(fifo[i].get()); dataProcessor[i]->SetFifo(fifo[i].get());
if (dataStreamer.size()) if (dataStreamer.size())
dataStreamer[i]->SetFifo(fifo[i].get()); dataStreamer[i]->SetFifo(fifo[i].get());
}
LOG(logINFO) << "Memory Allocated Per Fifo: " LOG(logINFO) << "Memory Allocated for Fifo " << i << ": "
<< (double)(((size_t)(generalData->imageSize) + << (double)(((size_t)(datasize) +
(size_t)(generalData->fifoBufferHeaderSize)) * (size_t)(generalData->fifoBufferHeaderSize)) *
(size_t)fifoDepth) / (size_t)fifoDepth) /
(double)(1024 * 1024) (double)(1024 * 1024)
<< " MB"; << " MB";
}
LOG(logINFO) << numThreads << " Fifo structure(s) reconstructed"; LOG(logINFO) << numThreads << " Fifo structure(s) reconstructed";
} }

View File

@ -63,10 +63,14 @@ void Listener::ResetParametersforNewAcquisition() {
currentFrameIndex = 0; currentFrameIndex = 0;
lastCaughtFrameIndex = 0; lastCaughtFrameIndex = 0;
carryOverFlag = false; carryOverFlag = false;
carryOverPacket = sls::make_unique<char[]>(generalData->packetSize); uint32_t packetSize = generalData->packetSize;
memset(carryOverPacket.get(), 0, generalData->packetSize); if (myDetectorType == GOTTHARD2 && index != 0) {
listeningPacket = sls::make_unique<char[]>(generalData->packetSize); packetSize = generalData->vetoPacketSize;
memset(carryOverPacket.get(), 0, generalData->packetSize); }
carryOverPacket = sls::make_unique<char[]>(packetSize);
memset(carryOverPacket.get(), 0, packetSize);
listeningPacket = sls::make_unique<char[]>(packetSize);
memset(carryOverPacket.get(), 0, packetSize);
numPacketsStatistic = 0; numPacketsStatistic = 0;
numFramesStatistic = 0; numFramesStatistic = 0;
@ -89,10 +93,7 @@ void Listener::RecordFirstIndex(uint64_t fnum) {
} }
} }
void Listener::SetGeneralData(GeneralData *g) { void Listener::SetGeneralData(GeneralData *g) { generalData = g; }
generalData = g;
generalData->Print();
}
void Listener::CreateUDPSockets() { void Listener::CreateUDPSockets() {
if (!(*activated)) { if (!(*activated)) {
@ -108,10 +109,16 @@ void Listener::CreateUDPSockets() {
} }
ShutDownUDPSocket(); ShutDownUDPSocket();
uint32_t packetSize = generalData->packetSize;
if (myDetectorType == GOTTHARD2 && index != 0) {
packetSize = generalData->vetoPacketSize;
}
// InterfaceNameToIp(eth).str().c_str() // InterfaceNameToIp(eth).str().c_str()
try { try {
udpSocket = sls::make_unique<sls::UdpRxSocket>( udpSocket = sls::make_unique<sls::UdpRxSocket>(
*udpPortNumber, generalData->packetSize, *udpPortNumber, packetSize,
((*eth).length() ? sls::InterfaceNameToIp(*eth).str().c_str() ((*eth).length() ? sls::InterfaceNameToIp(*eth).str().c_str()
: nullptr), : nullptr),
*udpSocketBufferSize); *udpSocketBufferSize);
@ -152,9 +159,14 @@ void Listener::CreateDummySocketForUDPSocketBufferSize(int64_t s) {
(*eth) = ""; (*eth) = "";
} }
uint32_t packetSize = generalData->packetSize;
if (myDetectorType == GOTTHARD2 && index != 0) {
packetSize = generalData->vetoPacketSize;
}
// create dummy socket // create dummy socket
try { try {
sls::UdpRxSocket g(*udpPortNumber, generalData->packetSize, sls::UdpRxSocket g(*udpPortNumber, packetSize,
((*eth).length() ((*eth).length()
? sls::InterfaceNameToIp(*eth).str().c_str() ? sls::InterfaceNameToIp(*eth).str().c_str()
: nullptr), : nullptr),
@ -260,19 +272,24 @@ uint32_t Listener::ListenToAnImage(char *buf) {
uint32_t pnum = 0; uint32_t pnum = 0;
uint32_t numpackets = 0; uint32_t numpackets = 0;
uint32_t dsize = generalData->dataSize; uint32_t dsize = generalData->dataSize;
uint32_t hsize = generalData->headerSizeinPacket; //(includes empty header) uint32_t imageSize = generalData->imageSize;
uint32_t packetSize = generalData->packetSize;
if (myDetectorType == GOTTHARD2 && index != 0) {
dsize = generalData->vetoDataSize;
imageSize = generalData->vetoImageSize;
packetSize = generalData->vetoPacketSize;
}
uint32_t hsize = generalData->headerSizeinPacket;
uint32_t fifohsize = generalData->fifoBufferHeaderSize; uint32_t fifohsize = generalData->fifoBufferHeaderSize;
uint32_t pperFrame = generalData->packetsPerFrame; uint32_t pperFrame = generalData->packetsPerFrame;
bool isHeaderEmpty = true; bool isHeaderEmpty = true;
sls_detector_header *old_header = nullptr; sls_detector_header *old_header = nullptr;
sls_receiver_header *new_header = nullptr; sls_receiver_header *new_header = nullptr;
bool standardheader = generalData->standardheader; bool standardheader = generalData->standardheader;
uint32_t corrected_dsize = uint32_t corrected_dsize = dsize - ((pperFrame * dsize) - imageSize);
dsize - ((pperFrame * dsize) - generalData->imageSize);
// reset to -1 // reset to -1
memset(buf, 0, fifohsize); memset(buf, 0, fifohsize);
/*memset(buf + fifohsize, 0xFF, generalData->imageSize);*/
new_header = (sls_receiver_header *)(buf + FIFO_HEADER_NUMBYTES); new_header = (sls_receiver_header *)(buf + FIFO_HEADER_NUMBYTES);
// deactivated (eiger) // deactivated (eiger)
@ -294,7 +311,7 @@ uint32_t Listener::ListenToAnImage(char *buf) {
new_header->detHeader.column = column; new_header->detHeader.column = column;
new_header->detHeader.detType = (uint8_t)generalData->myDetectorType; new_header->detHeader.detType = (uint8_t)generalData->myDetectorType;
new_header->detHeader.version = (uint8_t)SLS_DETECTOR_HEADER_VERSION; new_header->detHeader.version = (uint8_t)SLS_DETECTOR_HEADER_VERSION;
return generalData->imageSize; return imageSize;
} }
// look for carry over // look for carry over
@ -338,7 +355,7 @@ uint32_t Listener::ListenToAnImage(char *buf) {
new_header->detHeader.row = row; new_header->detHeader.row = row;
new_header->detHeader.column = column; new_header->detHeader.column = column;
} }
return generalData->imageSize; return imageSize;
} }
// copy packet // copy packet
@ -427,8 +444,7 @@ uint32_t Listener::ListenToAnImage(char *buf) {
new_header->detHeader.row = row; new_header->detHeader.row = row;
new_header->detHeader.column = column; new_header->detHeader.column = column;
} }
return generalData return imageSize; // empty packet now, but not empty image
->imageSize; // empty packet now, but not empty image
} }
// update parameters // update parameters
@ -489,8 +505,7 @@ uint32_t Listener::ListenToAnImage(char *buf) {
// detectors) // detectors)
if (fnum != currentFrameIndex) { if (fnum != currentFrameIndex) {
carryOverFlag = true; carryOverFlag = true;
memcpy(carryOverPacket.get(), &listeningPacket[0], memcpy(carryOverPacket.get(), &listeningPacket[0], packetSize);
generalData->packetSize);
switch (*frameDiscardMode) { switch (*frameDiscardMode) {
case DISCARD_EMPTY_FRAMES: case DISCARD_EMPTY_FRAMES:
@ -508,7 +523,7 @@ uint32_t Listener::ListenToAnImage(char *buf) {
new_header->detHeader.row = row; new_header->detHeader.row = row;
new_header->detHeader.column = column; new_header->detHeader.column = column;
} }
return generalData->imageSize; return imageSize;
} }
// copy packet // copy packet
@ -568,7 +583,7 @@ uint32_t Listener::ListenToAnImage(char *buf) {
// complete image // complete image
new_header->detHeader.packetNumber = numpackets; // number of packets caught new_header->detHeader.packetNumber = numpackets; // number of packets caught
return generalData->imageSize; return imageSize;
} }
void Listener::PrintFifoStatistics() { void Listener::PrintFifoStatistics() {