From e8bdf5a50589b89438be70f1b2c396401008ade7 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 16 Jan 2020 15:33:35 +0100 Subject: [PATCH] gotthard2: updated register map; powerchip checking detector type; internal and external period, frames, exptime; set/get delay, get actualtime, measurement, framesfromstart enabled; which detector comment updated in cmdproxy, detector and slsdetector --- .../gotthard2DetectorServer/RegisterDefs.h | 144 ++++-- .../bin/gotthard2DetectorServer_developer | Bin 156616 -> 169796 bytes .../slsDetectorFunctionList.c | 425 ++++++++++++++---- .../slsDetectorServer_defs.h | 10 +- .../mythen3DetectorServer/RegisterDefs.h | 28 +- .../bin/mythen3DetectorServer_developer | Bin 158944 -> 158944 bytes .../slsDetectorFunctionList.c | 43 +- .../slsDetectorServer_defs.h | 4 +- .../include/slsDetectorFunctionList.h | 39 +- .../include/slsDetectorServer_funcs.h | 2 +- .../src/ALTERA_PLL_CYCLONE10.c | 6 +- .../src/slsDetectorServer_funcs.c | 47 +- slsDetectorSoftware/include/Detector.h | 64 +-- slsDetectorSoftware/src/CmdProxy.cpp | 30 +- slsDetectorSoftware/src/CmdProxy.h | 48 +- slsDetectorSoftware/src/slsDetector.h | 28 +- slsSupportLib/include/versionAPI.h | 4 +- 17 files changed, 661 insertions(+), 261 deletions(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h index 0514d4238..17bba40ed 100644 --- a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h @@ -14,13 +14,33 @@ /* Base addresses 0x1806 0000 ---------------------------------------------*/ /* General purpose control and status registers */ -#define BASE_CONTROL (0x0000) -/* Acquisition? TODO */ -#define BASE_ACQUISITION (0x0200) +#define BASE_CONTROL (0x0000) // 0x1806_0000 - 0x1806_00FF +// https://git.psi.ch/sls_detectors_firmware/gotthard_II_mcb/blob/master/code/hdl/ctrl/ctrl.vhd + +/* ASIC Control */ +#define BASE_ASIC (0x0100) // 0x1806_0100 - 0x1806_011F +// https://git.psi.ch/sls_detectors_firmware/gotthard_II_mcb/blob/master/code/hdl/asic/asic_ctrl.vhd + +/* ASIC Digital Interface. Data recovery core */ +#define BASE_ADIF (0x0120) // 0x1806_0120 - 0x1806_012F +// https://git.psi.ch/sls_detectors_firmware/gotthard_II_mcb/blob/master/code/hdl/adif/adif_ctrl.vhd + +/* Formatting of data core */ +#define BASE_FMT (0x0130) // 0x1806_0130 - 0x1806_013F + +/* Packetizer */ +#define BASE_PKT (0x0140) // 0x1806_0140 - 0x1806_014F +// https://git.psi.ch/sls_detectors_firmware/gotthard_II_mcb/blob/master/code/hdl/pkt/pkt_ctrl.vhd + +/* Flow control and status registers */ +#define BASE_FLOW_CONTROL (0x00200) // 0x1806_0200 - 0x1806_02FF +// https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/f37608230b4721661f29aacc20124555705ee705/flow/flow_ctrl.vhd + /* UDP datagram generator */ #define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF + /* Clock Generation registers ------------------------------------------------------*/ #define PLL_RESET_REG (0x00 * REG_OFFSET + BASE_CLK_GENERATION) @@ -30,6 +50,7 @@ #define PLL_RESET_SYSTEM_MSK (0x00000001 << PLL_RESET_SYSTEM_OFST) + /* Control registers --------------------------------------------------*/ /* Module Control Board Serial Number register */ @@ -61,11 +82,6 @@ /* Status register */ #define STATUS_REG (0x04 * REG_OFFSET + BASE_CONTROL) -#ifdef VIRTUAL -#define RUN_BUSY_OFST (0) -#define RUN_BUSY_MSK (0x00000001 << RUN_BUSY_OFST) -#endif - /* Look at me read only register */ #define LOOK_AT_ME_REG (0x05 * REG_OFFSET + BASE_CONTROL) @@ -88,43 +104,113 @@ #define CONTROL_PRPHRL_RST_MSK (0x00000001 << CONTROL_PRPHRL_RST_OFST) #define CONTROL_CLR_ACQSTN_FIFO_OFST (15) #define CONTROL_CLR_ACQSTN_FIFO_MSK (0x00000001 << CONTROL_CLR_ACQSTN_FIFO_OFST) - -/* Pattern IO Control 64 bit register */ -#define PATTERN_IO_CTRL_LSB_REG (0x22 * REG_OFFSET + BASE_CONTROL) -#define PATTERN_IO_CTRL_MSB_REG (0x23 * REG_OFFSET + BASE_CONTROL) +#define CONTROL_PWR_CHIP_OFST (31) +#define CONTROL_PWR_CHIP_MSK (0x00000001 << CONTROL_PWR_CHIP_OFST) /** DTA Offset Register */ #define DTA_OFFSET_REG (0x24 * REG_OFFSET + BASE_CONTROL) +/* ASIC registers --------------------------------------------------*/ + +/* ASIC Config register */ +#define ASIC_CONFIG_REG (0x00 * REG_OFFSET + BASE_ASIC) + +#define ASIC_CONFIG_RUN_MODE_OFST (0) +#define ASIC_CONFIG_RUN_MODE_MSK (0x00000003 << ASIC_CONFIG_RUN_MODE_OFST) +#define ASIC_CONFIG_RUN_MODE_INT_BURST_VAL ((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_EXT_BURST_VAL ((0x3 << ASIC_CONFIG_RUN_MODE_OFST) & ASIC_CONFIG_RUN_MODE_MSK) +#define ASIC_CONFIG_GAIN_OFST (4) +#define ASIC_CONFIG_GAIN_MSK (0x00000003 << ASIC_CONFIG_GAIN_OFST) +#define ASIC_CONFIG_RST_DAC_OFST (15) +#define ASIC_CONFIG_RST_DAC_MSK (0x00000001 << ASIC_CONFIG_RST_DAC_OFST) +#define ASIC_CONFIG_DONE_OFST (31) +#define ASIC_CONFIG_DONE_MSK (0x00000001 << ASIC_CONFIG_DONE_OFST) + +/* ASIC Internal Frames Register */ +#define ASIC_INT_FRAMES_REG (0x01 * REG_OFFSET + BASE_ASIC) + +#define ASIC_INT_FRAMES_OFST (0) +#define ASIC_INT_FRAMES_MSK (0x00000FFF << ASIC_INT_FRAMES_OFST) + +/* ASIC Period 64bit Register */ +#define ASIC_INT_PERIOD_LSB_REG (0x02 * REG_OFFSET + BASE_ASIC) +#define ASIC_INT_PERIOD_MSB_REG (0x03 * REG_OFFSET + BASE_ASIC) + +/* ASIC Exptime 64bit Register */ +#define ASIC_INT_EXPTIME_LSB_REG (0x04 * REG_OFFSET + BASE_ASIC) +#define ASIC_INT_EXPTIME_MSB_REG (0x05 * REG_OFFSET + BASE_ASIC) + + +/* Flow control registers --------------------------------------------------*/ + +/* Flow status Register*/ +#define FLOW_STATUS_REG (0x00 * REG_OFFSET + BASE_FLOW_CONTROL) +#define FLOW_STATUS_RUN_BUSY_OFST (0) +#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_MSK (0x00000001 << FLOW_STATUS_WAIT_FOR_TRGGR_OFST) +#define FLOW_STATUS_DLY_BFRE_TRGGR_OFST (4) +#define FLOW_STATUS_DLY_BFRE_TRGGR_MSK (0x00000001 << FLOW_STATUS_DLY_BFRE_TRGGR_OFST) +#define FLOW_STATUS_FIFO_FULL_OFST (5) +#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_MSK (0x00000001 << FLOW_STATUS_DLY_AFTR_TRGGR_OFST) +#define FLOW_STATUS_CSM_BUSY_OFST (17) +#define FLOW_STATUS_CSM_BUSY_MSK (0x00000001 << FLOW_STATUS_CSM_BUSY_OFST) + +/* Delay left 64bit Register */ +#define GET_DELAY_LSB_REG (0x02 * REG_OFFSET + BASE_FLOW_CONTROL) +#define GET_DELAY_MSB_REG (0x03 * REG_OFFSET + BASE_FLOW_CONTROL) -/* Acquisition registers --------------------------------------------------*/ -//TODO /* Triggers left 64bit Register */ -#define GET_CYCLES_LSB_REG (0x10 + BASE_ACQUISITION) -#define GET_CYCLES_MSB_REG (0x14 + BASE_ACQUISITION) +#define GET_CYCLES_LSB_REG (0x04 * REG_OFFSET + BASE_FLOW_CONTROL) +#define GET_CYCLES_MSB_REG (0x05 * REG_OFFSET + BASE_FLOW_CONTROL) /* Frames left 64bit Register */ -#define GET_FRAMES_LSB_REG (0x18 + BASE_ACQUISITION) -#define GET_FRAMES_MSB_REG (0x1C + BASE_ACQUISITION) +#define GET_FRAMES_LSB_REG (0x06 * REG_OFFSET + BASE_FLOW_CONTROL) +#define GET_FRAMES_MSB_REG (0x07 * REG_OFFSET + BASE_FLOW_CONTROL) + +/* Period left 64bit Register */ +#define GET_PERIOD_LSB_REG (0x08 * REG_OFFSET + BASE_FLOW_CONTROL) +#define GET_PERIOD_MSB_REG (0x09 * REG_OFFSET + BASE_FLOW_CONTROL) + +/* Time from Start 64 bit register */ +#define TIME_FROM_START_LSB_REG (0x0A * REG_OFFSET + BASE_FLOW_CONTROL) +#define TIME_FROM_START_MSB_REG (0x0B * REG_OFFSET + BASE_FLOW_CONTROL) + +/* Get Frames from Start 64 bit register (frames from last reset using CONTROL_CRST) */ +#define FRAMES_FROM_START_LSB_REG (0x0C * REG_OFFSET + BASE_FLOW_CONTROL) +#define FRAMES_FROM_START_MSB_REG (0x0D * REG_OFFSET + BASE_FLOW_CONTROL) + +/* Measurement Time 64 bit register (timestamp at a frame start until reset)*/ +#define START_FRAME_TIME_LSB_REG (0x0E * REG_OFFSET + BASE_FLOW_CONTROL) +#define START_FRAME_TIME_MSB_REG (0x0F * REG_OFFSET + BASE_FLOW_CONTROL) /* Delay 64bit Write-register */ -#define SET_DELAY_LSB_REG (0x88 + BASE_ACQUISITION) -#define SET_DELAY_MSB_REG (0x8C + BASE_ACQUISITION) +#define SET_DELAY_LSB_REG (0x22 * REG_OFFSET + BASE_FLOW_CONTROL) +#define SET_DELAY_MSB_REG (0x23 * REG_OFFSET + BASE_FLOW_CONTROL) /* Cylces 64bit Write-register */ -#define SET_CYCLES_LSB_REG (0x90 + BASE_ACQUISITION) -#define SET_CYCLES_MSB_REG (0x94 + BASE_ACQUISITION) +#define SET_CYCLES_LSB_REG (0x24 * REG_OFFSET + BASE_FLOW_CONTROL) +#define SET_CYCLES_MSB_REG (0x25 * REG_OFFSET + BASE_FLOW_CONTROL) /* Frames 64bit Write-register */ -#define SET_FRAMES_LSB_REG (0x98 + BASE_ACQUISITION) -#define SET_FRAMES_MSB_REG (0x9C + BASE_ACQUISITION) +#define SET_FRAMES_LSB_REG (0x26 * REG_OFFSET + BASE_FLOW_CONTROL) +#define SET_FRAMES_MSB_REG (0x27 * REG_OFFSET + BASE_FLOW_CONTROL) /* Period 64bit Write-register */ -#define SET_PERIOD_LSB_REG (0xA0 + BASE_ACQUISITION) -#define SET_PERIOD_MSB_REG (0xA4 + BASE_ACQUISITION) +#define SET_PERIOD_LSB_REG (0x28 * REG_OFFSET + BASE_FLOW_CONTROL) +#define SET_PERIOD_MSB_REG (0x29 * REG_OFFSET + BASE_FLOW_CONTROL) -/* Exptime 64bit Write-register */ -#define SET_EXPTIME_LSB_REG (0xA8 + BASE_ACQUISITION) -#define SET_EXPTIME_MSB_REG (0xBC + BASE_ACQUISITION) \ No newline at end of file +/* External Signal register */ +#define EXT_SIGNAL_REG (0x30 * REG_OFFSET + BASE_FLOW_CONTROL) + +#define EXT_SIGNAL_OFST (0) +#define EXT_SIGNAL_MSK (0x00000001 << EXT_SIGNAL_OFST) + +/* Trigger Delay 64 bit register */ +#define SET_TRIGGER_DELAY_LSB_REG (0x32 * REG_OFFSET + BASE_FLOW_CONTROL) +#define SET_TRIGGER_DELAY_MSB_REG (0x33 * REG_OFFSET + BASE_FLOW_CONTROL) diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 22a7af021f0fffb45f83fb987fe1cefc15e5577f..6b9e1fa8bf642718c6b492694e0641785506ef2f 100755 GIT binary patch literal 169796 zcmeFa4V)ZB(fB`iH@A6DHYAhTKsYWCLc*JXQQ-t`h2u>@QTZt-0)Yg`Lr5YyUc^8a zJTxL`;6VjNjqf}>s1c(gBDd-xQBb2sxRAF!2q8dt4s?yjn?uI`3<@APvfIQuwz zJ1H>oY*KxY3c!+TNiL~|G?Gk4jt$ai?j^}H$y<{C)$>1T+}LVO^1YJ|o@d@s?PSgl z(sT-(@GeKomFGgy1fEaexukaPB?(-?BLlm4?dJv^c_ghI-Kyq|0gKL?WU099Lx1210QUz zaygPDJdnR5NKK>>q+>|Ok%o}uuaR^jX}sL}jrY8B7{x-46vGW8F(%kUwdc z0i*`f2_*TW8+H4W{?XfCf9r)o2A1|o{?W|z%lKc|7J?m4l73ZB@=3|Ru}OrvKhRtc z;JO#-5OeQwoj}^p+=mysr~d8E|NE1qFUsG$gNsvVuHoe%fKjAuh)7(gz|6y!R++vv z*g28=dP9WNk4Mgd*8SbwA8y@$jr%6+KIEYkQ%|ZQzf-N}p8$8Jb$>D6UufMIdERW@ zPvHBUb-$43H(2*~a=+rcft=Wl9`qjayVZLB8}5H#-Cxc9LhJrq?(ehize#?Jt@{x? zUuxawd0w#Yn|Z$8y1$eAP1b!g@4Gsp9Y^>%jQXUl`wPL1vF;~xKf$`MCBI45{b}51 zt^22V|77d_Iqpxl?lwYost+4JV@_e0j|6QJMuf*FZ|9vuto#4r{z&WoUC^KY9(|I*E%eXi`H9x^m&orl>%N8O z=UDd*d_Uc~KauyZuyLJC3?$=oNp&a2er=Ii*=|$`LINslC-M^3fapza7{1}ep8_a!wBaCplbh_13+E4!l^j-n*T%Pde?Cv!_hGWa}JnA@1m*A&iUt0zjXG6&g|w(&YSfaXX+Kxn#t_^ zX;(}+f66rH!seMXrtAN+o!PT4nKq;Oe4b98GG)s7?{v&`qcB9 zoyq6UyrkKg73SDH^CIWsizm-=&c9%4GetLFGM#rXo_g_YC_ejaikdO=?CCSlo7_BY z<_zcDX)~sPJ%9Sl$<3F}m_2RE`OamtXBcv4H&2;)sn$sz&z?5>e91@Zdj5ISXU?7q z1Qi`o;Jg|{E}(S+A*4^z<=nF8|9I5=!BC`I_B834?Fm< zLqY4e=gq#9iq8;2qkC>eLRVo^1pmak==#@%@4}Uay1py-O*wp!U)T3?FBDZdr*ch` z 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 b%V>~~L{tu?qvLCwW4b>u9$7jtkG%W>#HxMp literal 156616 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 z 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 diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 8321e79b6..c721620f8 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -39,13 +39,14 @@ uint32_t clkFrequency[NUM_CLOCKS] = {0, 0, 0, 0, 0, 0}; int highvoltage = 0; int dacValues[NDAC] = {0}; int onChipdacValues[ONCHIP_NDAC][NCHIP] = {0}; -int defaultDacValues[NDAC] = {0}; -int defaultOnChipdacValues[ONCHIP_NDAC][NCHIP] = {0}; int injectedChannelsOffset = 0; int injectedChannelsIncrement = 0; int vetoReference[NCHIP][NCHAN]; uint8_t adcConfiguration[NCHIP][NADC]; int burstMode = 0; +int64_t exptime_ns = 0; +int64_t period_ns = 0; +int64_t nframes = 0; int detPos[2] = {0, 0}; int isInitCheckDone() { @@ -72,6 +73,7 @@ void basictests() { } return; #else + FILE_LOG(logINFOBLUE, ("************ Gotthard2 Server *********************\n")); if (mapCSP0() == FAIL) { strcpy(initErrorMessage, "Could not map to memory. Dangerous to continue.\n"); @@ -97,7 +99,7 @@ void basictests() { int64_t client_sw_apiversion = getClientServerAPIVersion(); uint32_t requiredFirmwareVersion = REQRD_FRMWRE_VRSN; - FILE_LOG(logINFOBLUE, ("************ Gotthard2 Server *********************\n" + FILE_LOG(logINFOBLUE, ("*************************************************\n" "Hardware Version:\t\t 0x%x\n" "Detector IP Addr:\t\t 0x%x\n" @@ -158,7 +160,6 @@ void basictests() { return; } FILE_LOG(logINFO, ("Compatibility - success\n")); - #endif } @@ -352,12 +353,10 @@ void setupDetector() { } for (i = 0; i < NDAC; ++i) { dacValues[i] = 0; - defaultDacValues[i] = 0; } for (i = 0; i < ONCHIP_NDAC; ++i) { for (j = 0; j < NCHIP; ++j) { onChipdacValues[i][j] = -1; - defaultOnChipdacValues[i][j] = -1; } } for (i = 0; i < NCHIP; ++i) { @@ -397,35 +396,10 @@ void setupDetector() { setNumTriggers(DEFAULT_NUM_CYCLES); setExpTime(DEFAULT_EXPTIME); setPeriod(DEFAULT_PERIOD); + setDelayAfterTrigger(DEFAULT_DELAY_AFTER_TRIGGER); + setTiming(DEFAULT_TIMING_MODE); } -int setDefaultDacs() { - int ret = OK; - FILE_LOG(logINFOBLUE, ("Setting Default Dac values\n")); - { - int idac = 0; - for(idac = 0; idac < NDAC; ++idac) { - setDAC((enum DACINDEX)idac, defaultDacValues[idac], 0); - } - } - return ret; -} - -int setDefaultOnChipDacs() { - int ret = OK; - FILE_LOG(logINFOBLUE, ("Setting Default On chip Dac values\n")); - { - int idac = 0, ichip = 0; - for(idac = 0; idac < ONCHIP_NDAC; ++idac) { - for(ichip = 0; ichip < NCHIP; ++ichip) { - setOnChipDAC((enum ONCHIP_DACINDEX)idac, ichip, defaultOnChipdacValues[idac][ichip]); - } - } - } - return ret; -} - - int readConfigFile() { if (initError == FAIL) { @@ -663,6 +637,31 @@ int readConfigFile() { return initError; } +/* firmware functions (resets) */ + +void cleanFifos() { +#ifdef VIRTUAL + return; +#endif + FILE_LOG(logINFO, ("Clearing Acquisition Fifos\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CLR_ACQSTN_FIFO_MSK); +} + +void resetCore() { +#ifdef VIRTUAL + return; +#endif + FILE_LOG(logINFO, ("Resetting Core\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CRE_RST_MSK); +} + +void resetPeripheral() { +#ifdef VIRTUAL + return; +#endif + FILE_LOG(logINFO, ("Resetting Peripheral\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PRPHRL_RST_MSK); +} /* set parameters - dr, roi */ @@ -671,16 +670,16 @@ int setDynamicRange(int dr){ } -/* parameters */ +/* parameters - timer */ void setNumFrames(int64_t val) { if (val > 0) { - FILE_LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val)); - set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); + FILE_LOG(logINFO, ("Setting number of frames %lld [local]\n", (long long int)val)); + nframes = val; } } int64_t getNumFrames() { - return get64BitReg(SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); + return nframes; } void setNumTriggers(int64_t val) { @@ -699,21 +698,13 @@ int setExpTime(int64_t val) { FILE_LOG(logERROR, ("Invalid exptime: %lld ns\n", (long long int)val)); return FAIL; } - FILE_LOG(logINFO, ("Setting exptime %lld ns\n", (long long int)val)); - val *= (1E-9 * READOUT_C0); - set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG); - - // validate for tolerance - int64_t retval = getExpTime(); - val /= (1E-9 * READOUT_C0); - if (val != retval) { - return FAIL; - } + FILE_LOG(logINFO, ("Setting exptime %lld ns [local]\n", (long long int)val)); + exptime_ns = val; return OK; } int64_t getExpTime() { - return get64BitReg(SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / (1E-9 * READOUT_C0); + return exptime_ns; } int setPeriod(int64_t val) { @@ -721,9 +712,65 @@ int setPeriod(int64_t val) { FILE_LOG(logERROR, ("Invalid period: %lld ns\n", (long long int)val)); return FAIL; } - FILE_LOG(logINFO, ("Setting period %lld ns\n", (long long int)val)); + FILE_LOG(logINFO, ("Setting period %lld ns [local]\n", (long long int)val)); + period_ns = val; + return OK; +} + +int64_t getPeriod() { + return period_ns; +} + +void setNumFramesBurst(int64_t val) { + FILE_LOG(logINFO, ("Setting number of frames %d [Burst mode]\n", (int)val)); + bus_w(ASIC_INT_FRAMES_REG, bus_r(ASIC_INT_FRAMES_REG) | (((int)val << ASIC_INT_FRAMES_OFST) & ASIC_INT_FRAMES_MSK)); +} + +int64_t getNumFramesBurst() { + return ((bus_r(ASIC_INT_FRAMES_REG) & ASIC_INT_FRAMES_MSK) >> ASIC_INT_FRAMES_OFST); +} + +void setNumFramesCont(int64_t val) { + FILE_LOG(logINFO, ("Setting number of frames %lld [Continuous mode]\n", (long long int)val)); + set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); +} + +int64_t getNumFramesCont() { + return get64BitReg(SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); +} + +int setExptimeBurst(int64_t val) { + FILE_LOG(logINFO, ("Setting exptime %lld ns [Burst mode]\n", (long long int)val)); + return setExptimeBoth(val); +} + +int setExptimeCont(int64_t val) { + FILE_LOG(logINFO, ("Setting exptime %lld ns [Continuous mode]\n", (long long int)val)); + return setExptimeBoth(val); +} + +int setExptimeBoth(int64_t val) { val *= (1E-9 * SYSTEM_C0); - set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG); + set64BitReg(val, ASIC_INT_EXPTIME_LSB_REG, ASIC_INT_EXPTIME_MSB_REG); + + // validate for tolerance + int64_t retval = getExptimeBoth(); + val /= (1E-9 * SYSTEM_C0); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getExptimeBoth() { + return get64BitReg(ASIC_INT_EXPTIME_LSB_REG, ASIC_INT_EXPTIME_MSB_REG) / (1E-9 * SYSTEM_C0); +} + + +int setPeriodBurst(int64_t val) { + FILE_LOG(logINFO, ("Setting period %lld ns [Burst mode]\n", (long long int)val)); + val *= (1E-9 * SYSTEM_C0); + set64BitReg(val, ASIC_INT_PERIOD_LSB_REG, ASIC_INT_PERIOD_MSB_REG); // validate for tolerance int64_t retval = getPeriod(); @@ -734,8 +781,48 @@ int setPeriod(int64_t val) { return OK; } -int64_t getPeriod() { - return get64BitReg(SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/ (1E-9 * SYSTEM_C0); +int64_t getPeriodBurst() { + return get64BitReg(ASIC_INT_PERIOD_LSB_REG, ASIC_INT_PERIOD_MSB_REG)/ (1E-9 * SYSTEM_C0); +} + +int setPeriodCont(int64_t val) { + FILE_LOG(logINFO, ("Setting period %lld ns [Continuous mode]\n", (long long int)val)); + val *= (1E-9 * FIXED_PLL_FREQUENCY); + set64BitReg(val, ASIC_INT_PERIOD_LSB_REG, ASIC_INT_PERIOD_MSB_REG); + + // validate for tolerance + int64_t retval = getPeriod(); + val /= (1E-9 * FIXED_PLL_FREQUENCY); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getPeriodCont() { + return get64BitReg(ASIC_INT_PERIOD_LSB_REG, ASIC_INT_PERIOD_MSB_REG)/ (1E-9 * FIXED_PLL_FREQUENCY); +} + +int setDelayAfterTrigger(int64_t val) { + if (val < 0) { + FILE_LOG(logERROR, ("Invalid delay after trigger: %lld ns\n", (long long int)val)); + return FAIL; + } + FILE_LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); + val *= (1E-9 * FIXED_PLL_FREQUENCY); + set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG); + + // validate for tolerance + int64_t retval = getDelayAfterTrigger(); + val /= (1E-9 * FIXED_PLL_FREQUENCY); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getDelayAfterTrigger() { + return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY); } int64_t getNumFramesLeft() { @@ -746,7 +833,25 @@ int64_t getNumTriggersLeft() { return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); } +int64_t getDelayAfterTriggerLeft() { + return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY); +} +int64_t getPeriodLeft() { + return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY); +} + +int64_t getFramesFromStart() { + return get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); +} + +int64_t getActualTime() { + return get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY * 2); +} + +int64_t getMeasurementTime() { + return get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY); +} /* parameters - dac, hv */ int setOnChipDAC(enum ONCHIP_DACINDEX ind, int chipIndex, int val) { @@ -866,6 +971,31 @@ int setHighVoltage(int val){ return highvoltage; } +/* parameters - timing */ +void setTiming( enum timingMode arg){ + if(arg != GET_TIMING_MODE){ + switch((int)arg){ + case AUTO_TIMING: + FILE_LOG(logINFO, ("Set Timing: Auto\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); + break; + case TRIGGER_EXPOSURE: + FILE_LOG(logINFO, ("Set Timing: Trigger\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); + break; + default: + FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg)); + return; + } + } +} + +enum timingMode getTiming() { + if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) + return TRIGGER_EXPOSURE; + return AUTO_TIMING; +} + int configureMAC() { @@ -951,9 +1081,9 @@ int configureMAC() { calcChecksum(udp); //TODO? - //cleanFifos(); - //resetCore(); - + cleanFifos(); + resetCore(); + //alignDeserializer(); return OK; } @@ -989,8 +1119,58 @@ void calcChecksum(udp_header* udp) { udp->ip_checksum = checksum; } +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int* getDetectorPosition() { + return detPos; +} + // Detector Specific +int checkDetectorType() { + FILE_LOG(logINFO, ("Checking type of module\n")); + FILE* fd = fopen(TYPE_FILE_NAME, "r"); + if (fd == NULL) { + FILE_LOG(logERROR, ("Could not open file %s to get type of the module attached\n", TYPE_FILE_NAME)); + return -1; + } + char buffer[MAX_STR_LENGTH]; + memset(buffer, 0, sizeof(buffer)); + fread (buffer, MAX_STR_LENGTH, sizeof(char), fd); + if (strlen(buffer) == 0) { + FILE_LOG(logERROR, ("Could not read file %s to get type of the module attached\n", TYPE_FILE_NAME)); + return -1; + } + int type = atoi(buffer); + if (type > TYPE_TOLERANCE) { + FILE_LOG(logERROR, ("No Module attached! Expected %d for Gotthard2, got %d\n", TYPE_GOTTHARD2_MODULE_VAL, type)); + return -2; + } + + if (abs(type - TYPE_GOTTHARD2_MODULE_VAL) > TYPE_TOLERANCE) { + FILE_LOG(logERROR, ("Wrong Module attached! Expected %d for Gotthard2, got %d\n", TYPE_GOTTHARD2_MODULE_VAL, type)); + return FAIL; + } + return OK; +} + +int powerChip (int on){ + if(on != -1){ + if(on){ + FILE_LOG(logINFO, ("Powering chip: on\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PWR_CHIP_MSK); + } + else{ + FILE_LOG(logINFO, ("Powering chip: off\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PWR_CHIP_MSK); + } + } + return ((bus_r(CONTROL_REG) & CONTROL_PWR_CHIP_MSK) >> CONTROL_PWR_CHIP_OFST); +} + int setPhase(enum CLKINDEX ind, int val, int degrees) { if (ind < 0 || ind >= NUM_CLOCKS) { FILE_LOG(logERROR, ("Unknown clock index %d to set phase\n", ind)); @@ -1471,21 +1651,58 @@ int setBurstMode(int burst) { int getBurstMode() { return burstMode; } + + /* aquisition */ -int setDetectorPosition(int pos[]) { - memcpy(detPos, pos, sizeof(detPos)); +int updateAcquisitionRegisters(char* mess) { + int64_t exptime_ns = 0; +int64_t period_ns = 0; +int64_t nframes = 0; + + // burst mode + if (burstMode) { + // validate #frames in burst mode + if (nframes > MAX_FRAMES_IN_BURST_MODE) { + sprintf(mess, "Could not start acquisition because number of frames %lld must be <= %d in burst mode.\n", (long long unsigned int)nframes, MAX_FRAMES_IN_BURST_MODE); + FILE_LOG(logERROR,(mess)); + return FAIL; + } + setNumFramesBurst(nframes); + // exptime + if (setExptimeBurst(exptime_ns) == FAIL) { + sprintf(mess, "Could not start acquisition because exptime could not be set in burst mode. Set %lld ns, got %lld ns.\n", (long long unsigned int)exptime_ns, getExptimeBoth()); + FILE_LOG(logERROR,(mess)); + return FAIL; + } + // period + if (setPeriodBurst(period_ns) == FAIL) { + sprintf(mess, "Could not start acquisition because period could not be set in burst mode. Set %lld ns, got %lld ns.\n", (long long unsigned int)period_ns, getPeriodBurst()); + FILE_LOG(logERROR,(mess)); + return FAIL; + } + } + // continuous + else { + // frames + setNumFramesCont(nframes); + // exptime + if (setExptimeCont(exptime_ns) == FAIL) { + sprintf(mess, "Could not start acquisition because exptime could not be set in continuous mode. Set %lld ns, got %lld ns.\n", (long long unsigned int)exptime_ns, getExptimeBoth()); + FILE_LOG(logERROR,(mess)); + return FAIL; + } + // period + if (setPeriodCont(period_ns) == FAIL) { + sprintf(mess, "Could not start acquisition because period could not be set in continuous mode. Set %lld ns, got %lld ns.\n", (long long unsigned int)period_ns, getPeriodCont()); + FILE_LOG(logERROR,(mess)); + return FAIL; + } + } return OK; } -int* getDetectorPosition() { - return detPos; -} - int startStateMachine(){ - if (burstMode && getNumFrames() > MAX_FRAMES_IN_BURST_MODE) { - return FAIL; - } #ifdef VIRTUAL // create udp socket if(createUDPSocket(0) != OK) { @@ -1503,6 +1720,13 @@ int startStateMachine(){ FILE_LOG(logINFOGREEN, ("Virtual Acquisition started\n")); return OK; #endif + FILE_LOG(logINFOBLUE, ("Starting State Machine\n")); + cleanFifos(); + + //start state machine + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK); + + FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); return OK; } @@ -1544,6 +1768,7 @@ void* start_timer(void* arg) { // set register frames left } + closeUDPSocket(0); // set status to idle virtual_status = 0; FILE_LOG(logINFOBLUE, ("Finished Acquiring\n")); @@ -1558,6 +1783,9 @@ int stopStateMachine(){ virtual_stop = 0; return OK; #endif + //stop state machine + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STP_ACQSTN_MSK); + FILE_LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); return OK; } @@ -1571,10 +1799,50 @@ enum runStatus getRunStatus(){ return RUNNING; } #endif - return IDLE; + FILE_LOG(logDEBUG1, ("Getting status\n")); + uint32_t retval = bus_r(FLOW_STATUS_REG); + FILE_LOG(logINFO, ("Status Register: %08x\n",retval)); + + enum runStatus s; + + //running + if (retval & FLOW_STATUS_RUN_BUSY_MSK) { + if (retval & FLOW_STATUS_WAIT_FOR_TRGGR_MSK) { + FILE_LOG(logINFOBLUE, ("Status: WAITING\n")); + s = WAITING; + } else { + if (retval & FLOW_STATUS_DLY_BFRE_TRGGR_MSK) { + FILE_LOG(logINFO, ("Status: Delay before Trigger\n")); + } else if (retval & FLOW_STATUS_DLY_AFTR_TRGGR_MSK) { + FILE_LOG(logINFO, ("Status: Delay after Trigger\n")); + } + FILE_LOG(logINFOBLUE, ("Status: RUNNING\n")); + s = RUNNING; + } + } + + //not running + else { + // stopped or error + if (retval & FLOW_STATUS_FIFO_FULL_MSK) { + FILE_LOG(logINFOBLUE, ("Status: STOPPED\n")); //FIFO FULL?? + s = STOPPED; + } else if (retval & FLOW_STATUS_CSM_BUSY_MSK) { + FILE_LOG(logINFOBLUE, ("Status: READ MACHINE BUSY\n")); + s = TRANSMITTING; + } else if (!retval) { + FILE_LOG(logINFOBLUE, ("Status: IDLE\n")); + s = IDLE; + } else { + FILE_LOG(logERROR, ("Status: Unknown status %08x\n", retval)); + s = ERROR; + } + } + + return s; } -void readFrame(int *ret, char *mess){ +void readFrame(int *ret, char *mess) { // wait for status to be done while(runBusy()){ usleep(500); @@ -1583,29 +1851,36 @@ void readFrame(int *ret, char *mess){ FILE_LOG(logINFOGREEN, ("acquisition successfully finished\n")); return; #endif + + *ret = (int)OK; + // frames left to give status + int64_t retval = getNumFramesLeft() + 1; + + if ( retval > 0) { + FILE_LOG(logERROR, ("No data and run stopped: %lld frames left\n",(long long int)retval)); + } else { + FILE_LOG(logINFOGREEN, ("Acquisition successfully finished\n")); + } } u_int32_t runBusy() { #ifdef VIRTUAL return virtual_status; #endif -#ifdef VIRTUAL - u_int32_t s = (bus_r(STATUS_REG) & RUN_BUSY_MSK); + u_int32_t s = (bus_r(FLOW_STATUS_REG) & FLOW_STATUS_RUN_BUSY_MSK); FILE_LOG(logDEBUG1, ("Status Register: %08x\n", s)); return s; -#endif - return -1; } /* common */ -int calculateDataBytes(){ +int calculateDataBytes() { return getTotalNumberOfChannels() * DYNAMIC_RANGE; } -int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} -int getNumberOfChips(){return NCHIP;} -int getNumberOfDACs(){return NDAC;} -int getNumberOfChannelsPerChip(){return NCHAN;} \ No newline at end of file +int getTotalNumberOfChannels() {return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} +int getNumberOfChips() {return NCHIP;} +int getNumberOfDACs() {return NDAC;} +int getNumberOfChannelsPerChip() {return NCHAN;} \ No newline at end of file diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h index f0ca630a9..13d926435 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -17,22 +17,27 @@ #define HV_DRIVER_FILE_NAME ("/etc/devlinks/hvdac") #define DAC_DRIVER_FILE_NAME ("/etc/devlinks/dac") #define ONCHIP_DAC_DRIVER_FILE_NAME ("/etc/devlinks/chipdac") +#define TYPE_FILE_NAME ("/etc/devlinks/type") #define CONFIG_FILE ("config.txt") #define DAC_MAX_MV (2048) #define ONCHIP_DAC_MAX_VAL (0x3FF) #define ADU_MAX_VAL (0xFFF) #define ADU_MAX_BITS (12) #define MAX_FRAMES_IN_BURST_MODE (2720) - +#define TYPE_GOTTHARD2_MODULE_VAL (512) +#define TYPE_TOLERANCE (10) +#define TYPE_NO_MODULE_STARTING_VAL (800) /** Default Parameters */ #define DEFAULT_NUM_FRAMES (1) #define DEFAULT_NUM_CYCLES (1) #define DEFAULT_EXPTIME (1 * 1000 * 1000) // 1 ms #define DEFAULT_PERIOD (1 * 1000 * 1000 * 1000) // 1 s +#define DEFAULT_DELAY_AFTER_TRIGGER (0) #define DEFAULT_HIGH_VOLTAGE (0) +#define DEFAULT_TIMING_MODE (AUTO_TIMING) #define DEFAULT_READOUT_C0 (144444448) // rdo_clk, 144 MHz -#define DEFAULT_READOUT_C1 (288888896) // rdo_x2_clk, 288 MHz +#define DEFAULT_READOUT_C1 (144444448) // rdo_x2_clk, 144 MHz #define DEFAULT_SYSTEM_C0 (144444448) // run_clk, 144 MHz #define DEFAULT_SYSTEM_C1 (72222224) // chip_clk, 72 MHz #define DEFAULT_SYSTEM_C2 (18055556) // sync_clk, 18 MHz @@ -40,6 +45,7 @@ /* Firmware Definitions */ #define IP_HEADER_SIZE (20) +#define FIXED_PLL_FREQUENCY (020000000) // 20MHz #define READOUT_PLL_VCO_FREQ_HZ (866666688) // Hz #define SYSTEM_PLL_VCO_FREQ_HZ (722222240) // Hz diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index c2c87312f..ce63c5adc 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -4,29 +4,38 @@ #define REG_OFFSET (4) /* Base addresses 0x1804 0000 ---------------------------------------------*/ + /* Reconfiguration core for readout pll */ #define BASE_READOUT_PLL (0x0000) // 0x1804_0000 - 0x1804_07FF + /* Reconfiguration core for system pll */ #define BASE_SYSTEM_PLL (0x0800) // 0x1804_0800 - 0x1804_0FFF + /* Clock Generation */ #define BASE_CLK_GENERATION (0x1000) // 0x1804_1000 - 0x1804_XXXX //TODO /* Base addresses 0x1806 0000 ---------------------------------------------*/ /* General purpose control and status registers */ -#define BASE_CONTROL (0x0000) // 0x1806_0000 - 0x1806_00FF https://git.psi.ch/sls_detectors_firmware/mythen_III_mcb/blob/master/code/hdl/ctrl/ctrl.vhd +#define BASE_CONTROL (0x0000) // 0x1806_0000 - 0x1806_00FF +// https://git.psi.ch/sls_detectors_firmware/mythen_III_mcb/blob/master/code/hdl/ctrl/ctrl.vhd /* ASIC Control */ #define BASE_ASIC (0x0100) // 0x1806_0100 - 0x1806_010F + /* ASIC Digital Interface. Data recovery core */ -#define BASE_ADIF (0x0110) // 0x1806_0110 - 0x1806_011F https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/adif/adif_ctrl.vhd +#define BASE_ADIF (0x0110) // 0x1806_0110 - 0x1806_011F +// https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/adif/adif_ctrl.vhd /* Formatting of data core */ #define BASE_FMT (0x0120) // 0x1806_0120 - 0x1806_012F + /* Pattern control and status registers */ -#define BASE_PATTERN_CONTROL (0x00200) // 0x1806_0200 - 0x1806_02FF https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/pattern_flow/pattern_flow_ctrl.vhd +#define BASE_PATTERN_CONTROL (0x00200) // 0x1806_0200 - 0x1806_02FF +// https://git.psi.ch/sls_detectors_firmware/vhdl_library/blob/2e81ccbdbc5cb81813ba190fbdba43e8d6884eb9/pattern_flow/pattern_flow_ctrl.vhd /* UDP datagram generator */ #define BASE_UDP_RAM (0x01000) // 0x1806_1000 - 0x1806_1FFF + /* Pattern RAM. Pattern table */ #define BASE_PATTERN_RAM (0x10000) // 0x1807_0000 - 0x1807_FFFF @@ -126,15 +135,15 @@ #define PAT_STATUS_REG (0x00 * REG_OFFSET + BASE_PATTERN_CONTROL) #define PAT_STATUS_RUN_BUSY_OFST (0) #define PAT_STATUS_RUN_BUSY_MSK (0x00000001 << PAT_STATUS_RUN_BUSY_OFST) -#define PAT_STATUS_WAIT_FOR_TRGGR_OFST (0) +#define PAT_STATUS_WAIT_FOR_TRGGR_OFST (3) #define PAT_STATUS_WAIT_FOR_TRGGR_MSK (0x00000001 << PAT_STATUS_WAIT_FOR_TRGGR_OFST) -#define PAT_STATUS_DLY_BFRE_TRGGR_OFST (0) +#define PAT_STATUS_DLY_BFRE_TRGGR_OFST (4) #define PAT_STATUS_DLY_BFRE_TRGGR_MSK (0x00000001 << PAT_STATUS_DLY_BFRE_TRGGR_OFST) -#define PAT_STATUS_FIFO_FULL_OFST (0) +#define PAT_STATUS_FIFO_FULL_OFST (5) #define PAT_STATUS_FIFO_FULL_MSK (0x00000001 << PAT_STATUS_FIFO_FULL_OFST) -#define PAT_STATUS_DLY_AFTR_TRGGR_OFST (0) +#define PAT_STATUS_DLY_AFTR_TRGGR_OFST (15) #define PAT_STATUS_DLY_AFTR_TRGGR_MSK (0x00000001 << PAT_STATUS_DLY_AFTR_TRGGR_OFST) -#define PAT_STATUS_CSM_BUSY_OFST (0) +#define PAT_STATUS_CSM_BUSY_OFST (17) #define PAT_STATUS_CSM_BUSY_MSK (0x00000001 << PAT_STATUS_CSM_BUSY_OFST) /* Delay left 64bit Register */ @@ -184,6 +193,9 @@ /* External Signal register */ #define EXT_SIGNAL_REG (0x30 * REG_OFFSET + BASE_PATTERN_CONTROL) +#define EXT_SIGNAL_OFST (0) +#define EXT_SIGNAL_MSK (0x00000001 << EXT_SIGNAL_OFST) + /* Trigger Delay 64 bit register */ #define SET_TRIGGER_DELAY_LSB_REG (0x32 * REG_OFFSET + BASE_PATTERN_CONTROL) #define SET_TRIGGER_DELAY_MSB_REG (0x33 * REG_OFFSET + BASE_PATTERN_CONTROL) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index bf2226b28ae8b6902a79de64ee3dadf85f952ff0..3878acc8486330c706d192f8b638bbc629f03d41 100755 GIT binary patch delta 41088 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 YJ}k2>>YJnFWM_k6vIM`?|If$%KMF->HUIzs diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index e2f44656e..c56c51af0 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -84,13 +84,10 @@ void basictests() { uint64_t macadd = getDetectorMAC(); int64_t fwversion = getFirmwareVersion(); int64_t swversion = getServerVersion(); - int64_t sw_fw_apiversion = 0; + int64_t sw_fw_apiversion = getFirmwareAPIVersion();; int64_t client_sw_apiversion = getClientServerAPIVersion(); uint32_t requiredFirmwareVersion = REQRD_FRMWRE_VRSN; - - if (fwversion >= MIN_REQRD_VRSN_T_RD_API) - sw_fw_apiversion = getFirmwareAPIVersion(); FILE_LOG(logINFOBLUE, ("*************************************************\n" "Hardware Version:\t\t 0x%x\n" @@ -609,7 +606,6 @@ int setDelayAfterTrigger(int64_t val) { int64_t getDelayAfterTrigger() { return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-9 * FIXED_PLL_FREQUENCY); - } int64_t getNumFramesLeft() { @@ -706,10 +702,26 @@ int setHighVoltage(int val){ /* parameters - timing */ void setTiming( enum timingMode arg){ - // to be implemented + if(arg != GET_TIMING_MODE){ + switch((int)arg){ + case AUTO_TIMING: + FILE_LOG(logINFO, ("Set Timing: Auto\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); + break; + case TRIGGER_EXPOSURE: + FILE_LOG(logINFO, ("Set Timing: Trigger\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); + break; + default: + FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg)); + return; + } + } } enum timingMode getTiming() { + if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) + return TRIGGER_EXPOSURE; return AUTO_TIMING; } @@ -1068,12 +1080,12 @@ int checkDetectorType() { } int type = atoi(buffer); if (type > TYPE_TOLERANCE) { - FILE_LOG(logERROR, ("No Module attached! Expected %d for Mythen, got %d\n", TYPE_MYTHEN3_MODULE_VAL, type)); + FILE_LOG(logERROR, ("No Module attached! Expected %d for Mythen3, got %d\n", TYPE_MYTHEN3_MODULE_VAL, type)); return -2; } if (abs(type - TYPE_MYTHEN3_MODULE_VAL) > TYPE_TOLERANCE) { - FILE_LOG(logERROR, ("Wrong Module attached! Expected %d for Mythen, got %d\n", TYPE_MYTHEN3_MODULE_VAL, type)); + FILE_LOG(logERROR, ("Wrong Module attached! Expected %d for Mythen3, got %d\n", TYPE_MYTHEN3_MODULE_VAL, type)); return FAIL; } return OK; @@ -1373,7 +1385,7 @@ int stopStateMachine(){ #endif //stop state machine bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STP_ACQSTN_MSK); - FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); + FILE_LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); return OK; } @@ -1430,7 +1442,7 @@ enum runStatus getRunStatus(){ return s; } -void readFrame(int *ret, char *mess){ +void readFrame(int *ret, char *mess) { // wait for status to be done while(runBusy()){ usleep(500); @@ -1450,7 +1462,6 @@ void readFrame(int *ret, char *mess){ } else { FILE_LOG(logINFOGREEN, ("Acquisition successfully finished\n")); } - } u_int32_t runBusy() { @@ -1464,11 +1475,11 @@ u_int32_t runBusy() { /* common */ -int calculateDataBytes(){ +int calculateDataBytes() { return 0; } -int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} -int getNumberOfChips(){return NCHIP;} -int getNumberOfDACs(){return NDAC;} -int getNumberOfChannelsPerChip(){return NCHAN;} +int getTotalNumberOfChannels() {return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} +int getNumberOfChips() {return NCHIP;} +int getNumberOfDACs() {return NDAC;} +int getNumberOfChannelsPerChip() {return NCHAN;} diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h index 4ec09e64f..87f13ba32 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -2,13 +2,12 @@ #include "sls_detector_defs.h" #define REQRD_FRMWRE_VRSN 0x190000 -#define MIN_REQRD_VRSN_T_RD_API 0x190000 #define CTRL_SRVR_INIT_TIME_US (300 * 1000) /* Hardware Definitions */ #define NCOUNTERS (3) -#define MAX_COUNTER_MSK (0x7) +#define MAX_COUNTER_MSK (0x7) #define NCHAN (128 * NCOUNTERS) #define NCHIP (10) #define NDAC (16) @@ -45,7 +44,6 @@ #define READOUT_PLL_VCO_FREQ_HZ (1250000000) // 1.25GHz #define SYSTEM_PLL_VCO_FREQ_HZ (1250000000) // 1.25GHz #define MAX_PATTERN_LENGTH (0x2000) // maximum number of words (64bit) -#define WAIT_TIME_US_STP_ACQ (100) /** Other Definitions */ #define BIT16_MASK (0xFFFF) diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 1932dbe03..bfb95cffb 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -84,11 +84,10 @@ int updateDatabytesandAllocateRAM(); void updateDataBytes(); #endif -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MYTHEN3D) || GOTTHARD2D +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MYTHEN3D) int setDefaultDacs(); #endif #ifdef GOTTHARD2D -int setDefaultOnChipDacs(); int readConfigFile(); #endif @@ -101,13 +100,13 @@ int readRegister(uint32_t offset, uint32_t* retval); uint32_t writeRegister16And32(uint32_t offset, uint32_t data); //FIXME its not there in ctb or moench? uint32_t readRegister16And32(uint32_t offset); #else -extern u_int32_t writeRegister(u_int32_t offset, u_int32_t data); // blackfin.h -extern u_int32_t readRegister(u_int32_t offset); // blackfin.h +extern u_int32_t writeRegister(u_int32_t offset, u_int32_t data); // blackfin.h or nios.h +extern u_int32_t readRegister(u_int32_t offset); // blackfin.h or nios.h #endif // firmware functions (resets) -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) void cleanFifos(); void resetCore(); void resetPeripheral(); @@ -178,6 +177,20 @@ int setExpTime(int64_t val); int64_t getExpTime(); int setPeriod(int64_t val); int64_t getPeriod(); +#ifdef GOTTHARD2D +void setNumFramesBurst(int64_t val); +int64_t getNumFramesBurst(); +void setNumFramesCont(int64_t val); +int64_t getNumFramesCont(); +int setExptimeBurst(int64_t val); +int setExptimeCont(int64_t val); +int setExptimeBoth(int64_t val); +int64_t getExptimeBoth(); +int setPeriodBurst(int64_t val); +int64_t getPeriodBurst(); +int setPeriodCont(int64_t val); +int64_t getPeriodCont(); +#endif #ifdef EIGERD int setSubExpTime(int64_t val); int64_t getSubExpTime(); @@ -203,22 +216,18 @@ void setCounterMask(uint32_t arg); uint32_t getCounterMask(); #endif -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int setDelayAfterTrigger(int64_t val); int64_t getDelayAfterTrigger(); -#endif -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int64_t getNumFramesLeft(); int64_t getNumTriggersLeft(); -#endif -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) int64_t getDelayAfterTriggerLeft(); int64_t getPeriodLeft(); #endif #ifdef GOTTHARDD int64_t getExpTimeLeft(); #endif -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int64_t getFramesFromStart(); int64_t getActualTime(); int64_t getMeasurementTime(); @@ -293,10 +302,8 @@ int setHighVoltage(int val); // parameters - timing, extsig -#if !defined(GOTTHARD2D) void setTiming( enum timingMode arg); enum timingMode getTiming(); -#endif #ifdef GOTTHARDD void setExtSignal(enum externalSignalFlag mode); int getExtSignal(); @@ -324,7 +331,6 @@ int getAdcConfigured(); int configureMAC(); int setDetectorPosition(int pos[]); int* getDetectorPosition(); -int isConfigurable(); #ifdef EIGERD @@ -443,6 +449,8 @@ int setClockDivider(enum CLKINDEX ind, int val); int getClockDivider(enum CLKINDEX ind); #elif GOTTHARD2D +int checkDetectorType(); +int powerChip (int on); int setPhase(enum CLKINDEX ind, int val, int degrees); int getPhase(enum CLKINDEX ind, int degrees); int getMaxPhase(enum CLKINDEX ind); @@ -485,6 +493,9 @@ int setTransmissionDelayRight(int value); // aquisition +#ifdef GOTTHARD2D +int updateAcquisitionRegisters(char* mess); +#endif #ifdef EIGERD int prepareAcquisition(); #endif diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 0b21ceabf..8e566e300 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -199,7 +199,7 @@ int set_inject_channel(int); int get_inject_channel(int); int set_veto_photon(int); int get_veto_photon(int); -int set_veto_refernce(int); +int set_veto_reference(int); int get_burst_mode(int); int set_burst_mode(int); int set_adc_enable_mask_10g(int); diff --git a/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c b/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c index 9596db253..a8c4c30ff 100755 --- a/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c +++ b/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL_CYCLONE10.c @@ -87,13 +87,9 @@ void ALTERA_PLL_C10_Reconfigure(int pllIndex) { void ALTERA_PLL_C10_ResetPLL (int pllIndex) { uint32_t resetreg = ALTERA_PLL_C10_Reset_Reg[pllIndex]; uint32_t resetmsk = ALTERA_PLL_C10_Reset_Msk[pllIndex]; - -#ifdef MYTHEN3D FILE_LOG(logINFO, ("Resetting PLL %d\n", pllIndex)); bus_w_csp1(resetreg, bus_r_csp1(resetreg) | resetmsk); -#else - FILE_LOG(logWARNING, ("Resetting PLL %d not implemented!\n", pllIndex)); -#endif + usleep(ALTERA_PLL_C10_WAIT_TIME_US); } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index d494ffbb9..9318dc779 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -484,7 +484,7 @@ void function_table() { flist[F_GET_INJECT_CHANNEL] = &get_inject_channel; flist[F_SET_VETO_PHOTON] = &set_veto_photon; flist[F_GET_VETO_PHOTON] = &get_veto_photon; - flist[F_SET_VETO_REFERENCE] = &set_veto_refernce; + flist[F_SET_VETO_REFERENCE] = &set_veto_reference; flist[F_GET_BURST_MODE] = &get_burst_mode; flist[F_SET_BURST_MODE] = &set_burst_mode; flist[F_SET_ADC_ENABLE_MASK_10G] = &set_adc_enable_mask_10g; @@ -685,10 +685,6 @@ int set_timing_mode(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting external communication mode to %d\n", arg)); -#ifdef GOTTHARD2D - functionNotImplemented(); -#else - // set if ((arg != GET_TIMING_MODE) && (Server_VerifyLock() == OK)) { switch (arg) { @@ -709,7 +705,6 @@ int set_timing_mode(int file_des) { retval = getTiming(); validate((int)arg, (int)retval, "set timing mode", DEC); FILE_LOG(logDEBUG1, ("Timing Mode: %d\n",retval)); -#endif return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } @@ -1782,6 +1777,12 @@ int start_acquisition(int file_des) { FILE_LOG(logERROR,(mess)); } else +#endif +#ifdef GOTTHARD2D + if (updateAcquisitionRegisters(mess) == FAIL) { + ret = FAIL; + } + else #endif if (configured == FAIL) { ret = FAIL; @@ -1792,12 +1793,8 @@ int start_acquisition(int file_des) { if (ret == FAIL) { #if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(VIRTUAL) sprintf(mess, "Could not start acquisition. Could not create udp socket in server. Check udp_dstip & udp_dstport.\n"); -#else -#if defined(GOTTHARD2D) - sprintf(mess, "Could not start acquisition due to #frames > %d in burst mode\n", MAX_FRAMES_IN_BURST_MODE); #else sprintf(mess, "Could not start acquisition\n"); -#endif #endif FILE_LOG(logERROR,(mess)); } @@ -1916,6 +1913,12 @@ int start_and_read_all(int file_des) { FILE_LOG(logERROR,(mess)); } else +#endif +#ifdef GOTTHARD2D + if (updateAcquisitionRegisters(mess) == FAIL) { + ret = FAIL; + } + else #endif if (configured == FAIL) { ret = FAIL; @@ -1926,12 +1929,8 @@ int start_and_read_all(int file_des) { if (ret == FAIL) { #if defined(VIRTUAL) || defined(CHIPTESTBOARDD) || defined(MOENCHD) sprintf(mess, "Could not start acquisition. Could not create udp socket in server. Check udp_dstip & udp_dstport.\n"); -#else -#if defined(GOTTHARD2D) - sprintf(mess, "Could not start acquisition due to #frames > %d in burst mode\n", MAX_FRAMES_IN_BURST_MODE); #else sprintf(mess, "Could not start acquisition\n"); -#endif #endif FILE_LOG(logERROR,(mess)); } @@ -2225,7 +2224,7 @@ int get_delay_after_trigger(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2244,7 +2243,7 @@ int set_delay_after_trigger(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting delay after trigger %lld ns\n", (long long int)arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -2458,7 +2457,7 @@ int get_period_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2473,7 +2472,7 @@ int get_delay_after_trigger_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2518,7 +2517,7 @@ int get_frames_from_start(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2533,7 +2532,7 @@ int get_actual_time(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2548,7 +2547,7 @@ int get_measurement_time(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -3836,12 +3835,12 @@ int power_chip(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Powering chip to %d\n", arg)); -#if (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && (!defined(MYTHEN3D)) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // set & get if ((arg == -1) || (Server_VerifyLock() == OK)) { -#ifdef MYTHEN3D +#if defined(MYTHEN3D) || defined(GOTTHARD2D) // check only when powering on if (arg != -1 && arg != 0) { int type_ret = checkDetectorType(); @@ -6446,7 +6445,7 @@ int get_veto_photon(int file_des) { } -int set_veto_refernce(int file_des) { +int set_veto_reference(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int args[2] = {-1, -1}; diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index 77cab4616..50cffb95b 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -152,10 +152,10 @@ class Detector { void setPeriod(ns t, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB][Mythen3] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ Result getDelayAfterTrigger(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Mythen3] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ void setDelayAfterTrigger(ns value, Positions pos = {}); /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ @@ -164,10 +164,10 @@ class Detector { /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ Result getNumberOfTriggersLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ Result getDelayAfterTriggerLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ Result getPeriodLeft(Positions pos = {}) const; Result getTimingMode(Positions pos = {}) const; @@ -200,45 +200,45 @@ class Detector { /** [Gotthard][Jungfrau][CTB] */ void setADCPhaseInDegrees(int value, Positions pos = {}); - /** [Gotthard2] Hz */ + /** [Mythen3][Gotthard2] Hz */ Result getClockFrequency(int clkIndex, Positions pos = {}); /** [not implemented] Hz */ void setClockFrequency(int clkIndex, int value, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ Result getClockPhase(int clkIndex, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ void setClockPhase(int clkIndex, int value, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ Result getMaxClockPhaseShift(int clkIndex, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ Result getClockPhaseinDegrees(int clkIndex, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ void setClockPhaseinDegrees(int clkIndex, int value, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ Result getClockDivider(int clkIndex, Positions pos = {}); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ void setClockDivider(int clkIndex, int value, Positions pos = {}); Result getHighVoltage(Positions pos = {}) const; - /** [Jungfrau][Mythen3] */ + /** [Jungfrau][Mythen3][Gotthard2] */ Result getPowerChip(Positions pos = {}) const; - /** [Jungfrau][Mythen3] */ + /** [Jungfrau][Mythen3][Gotthard2] */ void setPowerChip(bool on, Positions pos = {}); /** - * [Gotthard Options: 0, 90, 110, 120, 150, 180, 200] - * [Jungfrau, CTB Options: 0, 60 - 200] - * [Eiger Options: 0 - 200] + * [Gotthard] Options: 0, 90, 110, 120, 150, 180, 200 + * [Jungfrau], CTB Options: 0, 60 - 200 + * [Eiger][Mythen3][Gotthard2] Options: 0 - 200 */ void setHighVoltage(int value, Positions pos = {}); @@ -1100,40 +1100,40 @@ class Detector { /** [CTB] */ void setPatternClockControl(uint64_t word, Positions pos = {}); - /** [CTB] same as executing */ + /** [Mythen3][CTB] same as executing for CTB */ Result getPatternWord(int addr, Positions pos = {}); - /** [CTB] Caution: If word is -1 reads the addr (same as + /** [Mythen3][CTB] Caution: If word is -1 reads the addr (same as * executing the pattern) */ void setPatternWord(int addr, uint64_t word, Positions pos = {}); - /**[CTB] Options: level: -1 (complete pattern) and 0-2 levels + /** [Mythen3][CTB] Options: level: -1 (complete pattern) and 0-2 levels * @returns array of start address and stop address */ Result> getPatternLoopAddresses(int level, Positions pos = {}) const; - /** [CTB] Options: level: -1 (complete pattern) and 0-2 levels */ + /** [Mythen3][CTB] Options: level: -1 (complete pattern) and 0-2 levels */ void setPatternLoopAddresses(int level, int start, int stop, Positions pos = {}); - /**[CTB] Options: level: -1 (complete pattern) and 0-2 levels + /** [Mythen3][CTB] Options: level: -1 (complete pattern) and 0-2 levels * @returns number of loops */ Result getPatternLoopCycles(int level, Positions pos = {}) const; - /** [CTB] n: 0-2, level: -1 (complete pattern) and 0-2 levels */ + /** [Mythen3][CTB] n: 0-2, level: -1 (complete pattern) and 0-2 levels */ void setPatternLoopCycles(int level, int n, Positions pos = {}); - /* [CTB] */ + /* [Mythen3][CTB] */ Result getPatternWaitAddr(int level, Positions pos = {}) const; - /** [CTB] Options: level 0-2 */ + /** [Mythen3][CTB] Options: level 0-2 */ void setPatternWaitAddr(int level, int addr, Positions pos = {}); - /** [CTB] */ + /** [Mythen3][CTB] */ Result getPatternWaitTime(int level, Positions pos = {}) const; - /** [CTB] Options: level 0-2 */ + /** [Mythen3][CTB] Options: level 0-2 */ void setPatternWaitTime(int level, uint64_t t, Positions pos = {}); /** [CTB] */ @@ -1243,10 +1243,10 @@ class Detector { void clearBit(uint32_t addr, int bitnr, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] */ void executeFirmwareTest(Positions pos = {}); - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] */ void executeBusTest(Positions pos = {}); /** [Gotthard][Jungfrau][CTB] not possible to read back*/ @@ -1280,13 +1280,13 @@ class Detector { /** Execute a command on the detector server console */ void executeCommand(const std::string &value, Positions pos = {}); - /** [Jungfrau][CTB] */ + /** [Jungfrau][Mythen3][Gotthard2][CTB] */ Result getNumberOfFramesFromStart(Positions pos = {}) const; - /** [Jungfrau][CTB] Get time from detector start */ + /** [Jungfrau][Mythen3][Gotthard2][CTB] Get time from detector start */ Result getActualTime(Positions pos = {}) const; - /** [Jungfrau][CTB] Get timestamp at a frame start */ + /** [Jungfrau][Mythen3][Gotthard2][CTB] Get timestamp at a frame start */ Result getMeasurementTime(Positions pos = {}) const; std::string getUserDetails() const; diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 7796deb98..64a2445cb 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1455,7 +1455,7 @@ std::string CmdProxy::Pattern(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[fname]\n\t[Ctb] Loads binary pattern file with only pattern " + os << "[fname]\n\t[Mythen3][Ctb] Loads binary pattern file with only pattern " "words" << '\n'; } else if (action == defs::GET_ACTION) { @@ -1476,7 +1476,7 @@ std::string CmdProxy::PatternWord(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[step or address] [64 bit mask]\n\t[Ctb] 64 bit pattern at " + os << "[step or address] [64 bit mask]\n\t[Mythen3][Ctb] 64 bit pattern at " "address of pattern memory." << '\n'; } else if (action == defs::GET_ACTION) { @@ -1502,17 +1502,17 @@ std::string CmdProxy::PatternLoopAddresses(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patlimits") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of complete " + os << "[start addr] [stop addr] \n\t[Mythen3][Ctb] Limits of complete " "pattern." << '\n'; } else if (cmd == "patloop0") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of loop 0." + os << "[start addr] [stop addr] \n\t[Mythen3][Ctb] Limits of loop 0." << '\n'; } else if (cmd == "patloop1") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of loop 1." + os << "[start addr] [stop addr] \n\t[Mythen3][Ctb] Limits of loop 1." << '\n'; } else if (cmd == "patloop2") { - os << "[start addr] [stop addr] \n\t[Ctb] Limits of loop 2." + os << "[start addr] [stop addr] \n\t[Mythen3][Ctb] Limits of loop 2." << '\n'; } else { throw sls::RuntimeError( @@ -1557,11 +1557,11 @@ std::string CmdProxy::PatternLoopCycles(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patnloop0") { - os << "[n_cycles] \n\t[Ctb] Number of cycles of loop 0." << '\n'; + os << "[n_cycles] \n\t[Mythen3][Ctb] Number of cycles of loop 0." << '\n'; } else if (cmd == "patnloop1") { - os << "[n_cycles] \n\t[Ctb] Number of cycles of loop 1." << '\n'; + os << "[n_cycles] \n\t[Mythen3][Ctb] Number of cycles of loop 1." << '\n'; } else if (cmd == "patnloop2") { - os << "[n_cycles] \n\t[Ctb] Number of cycles of loop 2." << '\n'; + os << "[n_cycles] \n\t[Mythen3][Ctb] Number of cycles of loop 2." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1602,11 +1602,11 @@ std::string CmdProxy::PatternWaitAddress(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwait0") { - os << "[addr] \n\t[Ctb] Wait 0 address." << '\n'; + os << "[addr] \n\t[Mythen3][Ctb] Wait 0 address." << '\n'; } else if (cmd == "patwait1") { - os << "[addr] \n\t[Ctb] Wait 1 address." << '\n'; + os << "[addr] \n\t[Mythen3][Ctb] Wait 1 address." << '\n'; } else if (cmd == "patwait2") { - os << "[addr] \n\t[Ctb] Wait 2 address." << '\n'; + os << "[addr] \n\t[Mythen3][Ctb] Wait 2 address." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1647,11 +1647,11 @@ std::string CmdProxy::PatternWaitTime(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwaittime0") { - os << "[n_clk] \n\t[Ctb] Wait 0 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Mythen3][Ctb] Wait 0 time in clock cycles." << '\n'; } else if (cmd == "patwaittime1") { - os << "[n_clk] \n\t[Ctb] Wait 1 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Mythen3][Ctb] Wait 1 time in clock cycles." << '\n'; } else if (cmd == "patwaittime2") { - os << "[n_clk] \n\t[Ctb] Wait 2 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Mythen3][Ctb] Wait 2 time in clock cycles." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index eb4d3645b..c998b884b 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1003,47 +1003,54 @@ class CmdProxy { INTEGER_COMMAND_NOID(frames, getNumberOfFrames, setNumberOfFrames, std::stol, - "[n_frames]\n\tNumber of frames per aquire. In trigger mode, number of frames per trigger."); + "[n_frames]\n\tNumber of frames per aquire. In trigger mode, number of frames per trigger." + "\n\t[Gotthard2] Burst mode has a maximum of 2720 frames. Frames number for both modes are uploaded to detector just before acquisition starts"); INTEGER_COMMAND_NOID(triggers, getNumberOfTriggers, setNumberOfTriggers, std::stol, "[n_triggers]\n\tNumber of triggers per aquire. Use timing command to set timing mode."); TIME_COMMAND(exptime, getExptime, setExptime, - "[duration] [(optional unit) ns|us|ms|s]\n\tExposure time"); + "[duration] [(optional unit) ns|us|ms|s]\n\tExposure time" + "\n\t[Gotthard2] Uploaded to detector just before acquisition starts"); TIME_COMMAND(period, getPeriod, setPeriod, - "[duration] [(optional unit) ns|us|ms|s]\n\tPeriod between frames"); + "[duration] [(optional unit) ns|us|ms|s]\n\tPeriod between frames" + "\n\t[Gotthard2] Uploaded to detector just before acquisition starts"); TIME_COMMAND(delay, getDelayAfterTrigger, setDelayAfterTrigger, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Gotthard][Ctb][Mythen3] Delay after trigger"); + "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Delay after trigger"); GET_COMMAND(framesl, getNumberOfFramesLeft, - "\n\t[Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] Number of frames left in acquisition."); + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Number of frames left in acquisition."); GET_COMMAND(triggersl, getNumberOfTriggersLeft, - "\n\t[Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] Number of triggers left in acquisition."); + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition."); TIME_GET_COMMAND(delayl, getDelayAfterTriggerLeft, - "\n\t[Gotthard][Jungfrau][CTB] DelayLeft Delay Left in Acquisition."); + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] DelayLeft Delay Left in Acquisition."); TIME_GET_COMMAND(periodl, getPeriodLeft, - "\n\t[Gotthard][Jungfrau][CTB] Period left for current frame."); + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Period left for current frame."); INTEGER_COMMAND(timing, getTimingMode, setTimingMode, sls::StringTo, - "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Gotthard][Ctb] [auto|trigger]\n\t[Eiger] [auto|trigger|gating|burst_trigger]"); + "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] [auto|trigger]\n\t[Eiger] [auto|trigger|gating|burst_trigger]"); GET_COMMAND(maxadcphaseshift, getMaxADCPhaseShift, "\n\t[Jungfrau][CTB] Absolute maximum Phase shift of ADC clock."); INTEGER_COMMAND(vhighvoltage, getHighVoltage, setHighVoltage, std::stoi, - "[n_value]\n\tHigh voltage to the sensor in Voltage.\n\t[Gotthard] [0|90|110|120|150|180|200]\n\t[Eiger] 0-200\n\t[Jungfrau][Ctb] [0|60-200]"); + "[n_value]\n\tHigh voltage to the sensor in Voltage." + "\n\t[Gotthard] [0|90|110|120|150|180|200]" + "\n\t[Eiger][Mythen3][Gotthard2] 0-200" + "\n\t[Jungfrau][Ctb] [0|60-200]"); INTEGER_COMMAND(powerchip, getPowerChip, setPowerChip, std::stoi, - "[0, 1]\n\t[Jungfrau][Mythen3] Power the chip. Default 0. - \n\t[Jungfrau] Get will return power status. - Can be off if temperature event occured (temperature over temp_threshold with temp_control enabled. - \n\t[Mythen3] If module not connected or wrong module, 1 will fail. By default, not powered on"); + "[0, 1]\n\t[Jungfrau][Mythen3][Gotthard2] Power the chip. Default 0." + "\n\t[Jungfrau] Get will return power status." + "Can be off if temperature event occured (temperature over temp_threshold with temp_control enabled." + "\n\t[Mythen3] If module not connected or wrong module, 1 will fail. By default, not powered on" + "\n\t[Gotthard2] If module not connected or wrong module, 1 will fail. By default, powered on at server start up."); /** temperature */ @@ -1385,8 +1392,7 @@ class CmdProxy { INTEGER_COMMAND(rx_tcpport, getRxPort, setRxPort, std::stoi, "[port]\n\tTCP port for client-receiver communication. Default is 1954. Must be different if multiple receivers on same pc. Must be first command to set a receiver parameter. Multi command will automatically increment for individual modules."); - INTEGER_COMMAND( - rx_fifodepth, getRxFifoDepth, setRxFifoDepth, std::stoi, + INTEGER_COMMAND(rx_fifodepth, getRxFifoDepth, setRxFifoDepth, std::stoi, "[n_frames]\n\tSet the number of frames in the receiver fifo (buffer between listener and writer threads)."); INTEGER_COMMAND(rx_silent, getRxSilentMode, setRxSilentMode, std::stoi, @@ -1686,10 +1692,10 @@ class CmdProxy { "\n\t[Jungfrau][Ctb] Reboot controler (blackfin) of detector."); EXECUTE_SET_COMMAND(firmwaretest, executeFirmwareTest, - "\n\t[Jungfrau][Ctb][Gotthard] Firmware test, ie. reads a read fixed pattern from a register."); + "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Firmware test, ie. reads a read fixed pattern from a register."); EXECUTE_SET_COMMAND(bustest, executeBusTest, - "\n\t[Jungfrau][Ctb][Gotthard] Bus test, ie. keeps writing and reading back different values in R/W register."); + "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Bus test, ie. keeps writing and reading back different values in R/W register."); /* Insignificant */ @@ -1707,13 +1713,13 @@ class CmdProxy { "\n\tClient IP Address that last communicated with the detector."); GET_COMMAND(nframes, getNumberOfFramesFromStart, - "\n\t[Jungfrau][CTB] Number of frames from start run control."); + "\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB] Number of frames from start run control."); TIME_GET_COMMAND(now, getActualTime, - "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][CTB] Time from detector start up."); + "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB] Time from detector start up."); TIME_GET_COMMAND(timestamp, getMeasurementTime, - "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][CTB] Timestamp at a frame start."); + "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB] Timestamp at a frame start."); GET_COMMAND(rx_frameindex, getRxCurrentFrameIndex, "\n\tCurrent frame index received in receiver."); diff --git a/slsDetectorSoftware/src/slsDetector.h b/slsDetectorSoftware/src/slsDetector.h index 64d93fe57..a6ca0f03d 100755 --- a/slsDetectorSoftware/src/slsDetector.h +++ b/slsDetectorSoftware/src/slsDetector.h @@ -564,10 +564,10 @@ class slsDetector : public virtual slsDetectorDefs { void setPeriod(int64_t value); - /** [Gotthard][Jungfrau][CTB][Mythen3] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ int64_t getDelayAfterTrigger(); - /** [Gotthard][Jungfrau][CTB][Mythen3] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ void setDelayAfterTrigger(int64_t value); /** [Eiger] in 32 bit mode */ @@ -595,13 +595,13 @@ class slsDetector : public virtual slsDetectorDefs { /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ int64_t getNumberOfTriggersLeft() const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Gotthard2] */ int64_t getDelayAfterTriggerLeft() const; /** [Gotthard] */ int64_t getExptimeLeft() const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ int64_t getPeriodLeft() const; /** [Eiger] minimum two frames */ @@ -610,13 +610,13 @@ class slsDetector : public virtual slsDetectorDefs { /** [Eiger] */ int64_t getMeasuredSubFramePeriod() const; - /** [Jungfrau][CTB] */ + /** [Jungfrau][CTB][Mythen3][Gotthard2] */ int64_t getNumberOfFramesFromStart() const; - /** [Jungfrau][CTB] Get time from detector start */ + /** [Jungfrau][CTB][Mythen3][Gotthard2] Get time from detector start */ int64_t getActualTime() const; - /** [Jungfrau][CTB] Get timestamp at a frame start */ + /** [Jungfrau][CTB][Mythen3][Gotthard2] Get timestamp at a frame start */ int64_t getMeasurementTime() const; /** @@ -1836,25 +1836,25 @@ class slsDetector : public virtual slsDetectorDefs { */ void setDigitalIODelay(uint64_t pinMask, int delay); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ int getClockFrequency(int clkIndex); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ void setClockFrequency(int clkIndex, int value); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ int getClockPhase(int clkIndex, bool inDegrees); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ void setClockPhase(int clkIndex, int value, bool inDegrees); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ int getMaxClockPhaseShift(int clkIndex); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ int getClockDivider(int clkIndex); - /** [Gotthard2] */ + /** [Mythen3][Gotthard2] */ void setClockDivider(int clkIndex, int value); /** [Ctb][Moench] */ diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index cef067710..7c506e2b9 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -4,9 +4,9 @@ #define APIRECEIVER 0x190722 #define APIGUI 0x190723 #define APIMOENCH 0x190820 -#define APIGOTTHARD2 0x191127 #define APIGOTTHARD 0x191127 #define APIJUNGFRAU 0x191127 #define APICTB 0x191210 #define APIEIGER 0x200110 -#define APIMYTHEN3 0x200114 +#define APIMYTHEN3 0x200115 +#define APIGOTTHARD2 0x200116

89OG-+2+T$`X3xZF^0;?^wRV8~+lE{a|Y^Sx(P;Vo0P93t? zQ2jRGqWXhkNd3HMuIkAG7y8}B2opoutB0w?;dP8Ip=-wRMjfL#`eFpd(A)%Bvh$ME zME*$5GIpI;X*y7rQ~AWEH{>wJy*R0`7OH+P>+2V1mdaz3)f)Gi{mOUBgr)i(9nRW0J(ZRg0gG(I}I`lfSjD=|4HjhD9TCpSpr z{o6Ot(>kZ6wXl6#IXjL2*#5z2EeB`4Bc+nv0pCPx<#xPx2W{b<)**{^;_r4qSw7)M zJ7mfI5wmr5o;@py-_x-g8^Z^5tl?Y1Ci1x*9U&7(>+9VVzP{sVpER2%7j$Mz_=JLv zY&HL|UOEFH6U8@WR|@6!Ptw7X3d>dEdIvimvyZuffP=S26OtUJ%W&&B%l z9rxt~NFAbumlGhhi{`?^Y0@Kwjo?FiWXO3%d`XX(wjx6pC^3=hKF2EV5_rsN^KNAG0W^A4Zd z`ziJ&59$+_CVU@nPwMWSr@TGP=AG|ox!9V{HzZZ(WBN2;@AKt-l4^_ox8ROrMe*u= ztFiy^jJ`>liz6z=aghceZ1-;;$7l472oICp_T(_~^giJ)^-T>AvjKvis*TgV{Al0g zh%gMFCAsr#}#gZhF@Ph!AYBag2`xv=$llnLWYRKad4i^TY#b>^zU`H=v5d zf~B}?E$ryU*l0+0Pg6dtUpIDzAMICLwl(Ax`nQi1021v-u!-kkFx{fAfd*n{Dz zB-%Y;!TkIF>s@_>`{wtqmOUX!8$r83hd`%6(lkk`2C4&U2I>MD1eyf$tq+wN-n^Nv zN|`UP1hvMxSOs^m~l6qN|_VLk6=6Gj67vH>|Da+PIr; zMT*AVbX&gu!4;teWA)8+m0)c%tq$(W6#nFZZmcgqJRqie|FQbiI-p^qyMC~w97N?G zbRElQSaz%MDg(RK9j+O$=fwm_ah0e`j3RB?29x&Oflcc^Y|suT?MF!aC)mc`owWZP z*n&;r8G~vlQz`ry!jI9Wx(XjYs0DkHuNjo3JVoIp2ru!4UmO&#%%_ka5%QzYa=pRb zl!X-X9YVhIg*-R7HCw?C4sOxlMariVAla}v7t?~)s;ep9VZ=M^IwrO$sE1ZVYBzk7 zLJlG1kk?|c(_CFL@Yfr;O&kY$RfTOmT;v7Ys zqu!h#$4B{%KJjYv39PyUK_I+BC#(;`Ji$H5Z9?${MNzgTreU>EE1Z9JK zqw@>u)5fE&ZwNDv&Lf01kX-)A#|Siz&J%oom%6{p--b?$t-*T-Upkwice@7e{0y=Uow#so~fn zgQ8+>cU+||KbLnJIpJp2rlcwy5}ayiqhl^VH8L($x0+~o|7@{-H$|Z>7ey)B63Gij z4Q^iWmOUt(e5rfD!+Y08OK0%G#CHRan$z(6z+iWx^ zl?Bg9(n`=;&^FL6(0mh?bO2NW zIt{uEvOSNH3W^2Q0W|{UfeJvqp2z4L1ZE6q3TP&10ca&?Eod8P7id4|2X3g zAkY}l6wpl20?1%|Puy-9d$*k)TPSV$eL$ zGSF(!W{?N87vwsGf5$=RK-WOQOHc!#1W*bn8~0_qDI3K|b`gXVx1fmVSwg0_Qp zgARa7Kw38+fj+N@)c~{nXz*2t9}hl4cIg3+K?tJ&H~0|Zp9GH)qeY$rK7jc7;3eW0 zg1^pmoh9I}62B7sCE{NNe}VYd!Jj97tqZ~#65a&=JMnLWKS}&M;C~_heegdK{{i?P ziT?!r5#slP|Bm=C!5<|48}MHfe;E9J@Gem;B@jNRfS?;u{{hh_{1(n|KHKw}_A1WOoH^AfXll))HSA{OiOw0RJlS4Z*)m zd}Ht{iEjq}1>#$SUqXC4@G9~5fL}m-SMc*S-X+<3LYPYd{lL#AelYl%#198QgZRlp!A~Ln3Gj~+{}lKM#Lor)F!2k(kMTxc3}F-ntN=fp_*LK^BK|e-gNR=P z{z2l`gYQTDTj2W;zYTmZ;@<;*AMrcEcO~An3qofSJ_TPu{C@E5iT@US8{&_EZ%zDh z@Oi}l4!$|@=fUR?e+hgR@z=mNBA#uw2Q_38wk7C*6(FQiKqc_?iLVU44)KxTYY`s} zK8g4Q@bSdg1RqO$UGP!Fr-F|pzA^Z!#5ddQvIp5o$VWgW;tRls65kzs1>*aHw-G-G zJR^Q2_!~6gi~;`-@#Dc?CVmq5zlnbg{GWn%q4ZBcI75q}7L3h_t4*CoCL zd@}LBfXAjt%g`zC3B;cRU!C}i;G>EE2fTxLX^YpNF2Kb-2wsP}B6zPuZ3pjls2$+F z4s{%OuR~n}JRE8*6Lq%m_{sHL^-en#$%BnKM)rca_VMDv{y<>Ng3SUZTd*C#0xVe6 zA5O()!8!s9v|x_|3-Z|Y3DukMn*b|V6u$))Y{9Mr3$b7+XPio?1?vh7CtIe%Z8+;x z!hD!ZFYz}3EBQbjYkJP9gj=wwz#=Tz5@2=Vl>Q4ulX#fRQ2&|C>n+mM41zQH}E(^97Se6C51}xix zrCf2klqMGNsVhz;$AWo)HML-;fi<&W;a8nXa|`AMmTSRY1lB^s;81(3Kkgr=l4ns| z3aq6C+Xt+b1!LEoN^1+20xaKx^#pde5p$uc_W^8U1c5zv-Kn&-V1EH?XTc`ka4PLB zSU{;$>0rU`0@l%j^#kTAuz>Rc-ebYu0oKWaodMR_f+c#KN*4>(3)sCD>{(!4bu$lKK5#1cS+KUidRVYgzR?QJHTdG{lC8eK50>``Gr$?%7T4~ zL}pqrJ4*bt1#1UvmIa#(Y_<<0|E~av%<+M`|MwKIXDrxzz~)-8-+(=9!6NoMm3bDd zIk5Q_Y_tpDa~ALgVBCWJ2iO7&b{^RC7R>RbQ(0)i?gpk>uo1u(0WHgoZUpti*eo*uOh8=J!D=pa9z+SXqpMK+1 zUb0}B2c62x7HkNxRTgaVL6=i`#RBe!;;R;{!naQ4H4BylY_$a&0PJ-Ob`aPa3zl%m zsk|XDqyIMz;984fH(={5*jUVP>n+#{U>hvhYQ)`W!P35SDsOu1N@EJH z%T?M9rVS?Wv{#hKo3D)FN>?dQ?HI4!V)*yWnsSao^QLQJn&t~>cK*oIL*+IT_>WH~ z%U!exRW#Fdt%@$XrOx_--Oq2#YAO%9jZO_dWA=Wf=q~-T9d1Q&T*BQYxCI55?S{`8 z$R6SQ=6s<{pm1{vZ#`2(nMfgY6^>$_dS;rq!dEo6hWwZzak@o&I3Ov74&y>GGoQcy?AjX|Y2JmnD1N#$YL^Dy|IlbxLs|lHC@#vm~FnnRcgL z#oS}=kNCKGsd}Ov`006y@)l*E>Kez}%rjRFuZG+A)8~f?&D{A#txWb6T1ND# z$c*U%BO3Rbei>8Z{LFlV=+8X_hA4!xH{C2?PiFXaQbFM|zs zY|PDnU!jO<*|D|{?wwq|AWiwMta!ZB8_8a^qqkQJ$SZX6v=KFU>hrm>`ywxTzP8V% z`P%N9=Wz#TA#N<(+pRjU^iW0PeZd?%u_OpiKlza2M~NJ4;pu<6f^w@E0(-EusNpY|e_h-3;$NXuhr_ZcRm3 z(%YU!l6|WfNt!YD%ly@)EpX>a>MN1@L`>5t&2!<)&8C=}{ciC_o#AQ8Yaq#H)3srCdbMtxJ`8OsIvd-iB`kG}fmL-h1G$Xk2 z(Q(CK-jz|$xWU5dtLK(f&!$0$dcI1T!p$6FvZ0AVl#B0tp|Tjx zYJ3Fiz^gBhsp9X)n3+S+*xF2}4S8|T2f%!5Mg62miCc#25i;n8kMJW-@>3}T5`p5tCh(wiM!-0`QO+5e_cVs#b{%wBDFnZ``%zBc%aij20w zDBwF^3R2vpiqR*!skd%l(w4oeFQKeo@VJ*>y+x1k&5|?8%&q5CnkDD1>YVtjxpIBk zqh%K>=8aWp?0L~8lC+^gi-g`K&|JnD7?yaoq zT=%u|l7;tC4>kLduo%2fOkp8*8-MYYm@*B&8XvWpEZ($;@uM$A>%Bx@ytdy;QEw36 zlEde&>d-@btPdtPi`(EnxP7LjFL1}Pmb}3w_=w_|8bf$TG+?wm-MyQ%Ory#_F0|DD zzqZt?k^J=Qu@S;m5SL~gc)CN{7{()BY%d&uoUd)n{JCqf)V#&luNQ6yk9)rl`m@O8>Hjj9fBnyLDV~6nR%p2_J4KPp zYnEJEC%|&uE;(CY|4qFT{f+J!^pAo6+H$4;Gs})UwY+03y4FWpqa{)tS~_S(g=1}4 zK6~0tOBOEA@^f5CtW8nLpYTnL;w zj;q2;!TjOPjcJtgqAjiE)JbA@t50o|SDG^qZ_(yVtxSJtWorIEFH`F~D3hb*fijBp z$1RHF&CJb3YF}QFFtp^1Kwi2zS?TdVFH-+IC{koADM~ylYHlVe1CC@_&E(C^&1D)^ zUYVBf=q-!E^NzmayjNuITh*vGuxALg(MD@u|C#>WSy9Z*oQUmzjw@yJC{R z*=9P^xan-d zbPAvI^1-GhY_`>ld-VG?a4~I zw9UVRzp@RFPn9Bv5jb|LqM7wjKt7~wg zX6)!!SxOGYG3|wUy|3{^a9`f(>n!;mEl;{1M7gJ4z5eTNa(_c8om^39y#pC?UNP@? zz@bd0G|ZdmSqJJjp81YxmJ{=X<9caHzT{!(>dZFJ9BzaAW|R5Rm&HavO|8Q^^LxLk zZ7kBXZ)z)QS#`~Ke4`yUAN(d$e#MY!no=m!83%Jjri%_blr3ddCSP(ert$}tO#Q?A z@o23BbpE8hx-y5Q7;`k>+Zqi%C0mr3uVHBZa-hKstHoR2X3F0hvPf$TWik9vmi(I` z)O;RPbSSc3UYDSoSDNdT1yRE|M$@yv*B^3J3VK&R^TTNq&iuS%?5oba<##Q@O`~Ek z5C1Yt3CqzZDpObHhriQ$%#H6d<(SES&)HnPy$_?FM)*3cl0v3T9hSd)I4!zyP9m;I ze22L;8*^+P%8uiPiq5>Ze1kIlR-RlA8KsHTSJ?(nPG8o}eBVDQuRP`Q)4RJo6LenA zMS2D0DQoHZR;AdZ1;)NK?r4p~uH{+qCRgq>*{57f)EUJ5hx1Inzr=K$8C_B%aUj{a zg&*YKwcf_Y$UC)B?jCv~St@@IeXGv%Sh;ngU;NM-b9#BozQzeQvSeftDKZS zGi#TfvVIY7-e>9j^vP_^o$$K*k(clg0T0#u<_2rB6AzHNo6bcs1B;7$+7&jRNAc*} zZF%8J`w-JqEFR58FZX%K-;znwObY)(OzL!s?_XhXkULI4jMK30I-lGXFJJqRFF%#W ze&G8~(Q&bP@sWSe!b=2ley2do+VgvseEnTM!V$xFydI=`47A+P+I9GMxUoN!u{wn| zH95a}1#|3!Duusi@DO~fQ+Xa>)w1lB zDikpg#cNPZuL6W)ui&1OyrcZXzXr-PAM?9J<`LEDLVtOcA=Esi4qniX8oj;r1Io~y z^wQfm;>UMV^*%Rb6x!c7rm zsPgs_N98H{yCmoGxXWqm81HmBPIlvZ)8!ToPLNtvs8yY!zqUf`4y!iPCOC0Vj3Z*Z ze(CuSZ^WyYpA+%tUa5gui;NLAy!Fa%~w??pUriIk4rr!rjQyt@jLfYUzPHw4|PKvLR(3ML%RV;qy%l z8yNj4T5KrBnw5Ry(5L+0_@IxHG3s)@l>J_%vHGW)wS7tZweP&)r-#TUS@+|f7Al5x(`F8C}`L1xheKlHNYQ*cV@IqOA1yb=4ZoU4}CcFkq zyu`KZ%KeUCwJ>|$YG8OptMBEmxR1r>@vWnrh!?@0#7kqm`vttfR(O0i*b=*D_m&D0 zUb3fd2x3VgoAs;|2m7<4y^hP5l@k?M{|4_*5pO}U=izNU#b*sZ=6@(fya?8TSLEt7 zrH%_`J=tD$PcVB)_MBCVLf8buTA`i^VKJ=^P)r(LzB;B(s$H9|fLjYTSCQgyjapk! z??pXe##B%r(j!&GHEOSeT~n66P-lg*oQS+X^!J-+7qyR0@vpI_7qzHYL)m-EIm!bC zYj@1WnU0Y&=fQ+%n;-q5qhkgN^FBKmbXxP(2Ytgr=oi&3eo^KYHbeWqhGJC z7KXFR?7TWIoZY40)j}!h9RRDC_l^ziu}t_emngH|xnHvlJsMg{mxTS|5l-z^h%PJl zYrfBovI>Ye;&>PxB4=h+iGz96+7ayj9wui>ynzQ9(%O6_dYqOyL%UaOt}k=mI`H;1 z%8b@}VWRcagAuG=fak2%TEbc0v9`1NcmNAls*(xQ{Hi`_XV?#vm1LATNqv}Uw`lnG zw4F?4h%BcJ31)-79_XK|j5Avuv$meRzxv_a7-zQst~OK6wyila)Mk~cW!7d$HL_r? z%nz&Hsxq6KQ~dXp*~V`qhAz@soT?BSYKMksiU&i z`8q_hT)p$H*KTLYo!?tcmsz0FpG=s}sMJUY%TflLt?PNC3#7MMp+}jcSu-Unz`sI2 zVpjH*-@HQKvI3@ zQ31Yz-NrPqa_1R z8}L<3+4IboW^G^1__dAm%L+PF^XZHMs0tCa0#TjiA5Vb=avDOWe!DktSyX6=8Ka*EkjIVoqF zwaZRfKV=)pA2?dkxEg3TFf<_prY?(x**BN^o=vF3ERUr0#6*ItQ9l2<6`3+!#!~my zVVMtfKoFig5x0RGFSy5L!Zj7QvbIeMclhrmco4z3dmh)h>fm};g1FA5IdlUkho&=K^=Mt@yH!rDUXS&6ndVEp z+{baM6x)jy$HcZld__Y`ccdY~Q9H0Bi2xZA8%>EFg>!$@dvb=FJ*s<;+A{M8$}c`% z@gsDwg;B&SKu_;f|Eb3^0w;+&Q~PByN0S4Tq^KI~UbN&z)toU@4fYkjs=;9$Rn4^e z>>-yir&D*>ZGV=Q7^_F~^`Dq3wkS@qMG-G4b^L$};RzMcVioKT=ovDOGpY)jcUpyc=3QgWq`lh0Z&D znRJwtBEd>%zdUAJs@X`@uI3v*Q6i45=o2MDowP)ci8rZ=Lby+<;~KCU@>)akw85j~ zcQjy;siLgnD<)bQ^-qN8=bxLXjQFyNrRXLR?5;(^y=tR>1%H5KBsDSby!dH&3D#L8;8~tZ?rXae7)1w z5)FInPAjVCf2Gr=P!?|Pw72sB8dI$DJOFW_&g?K-uVZ-~fLmLlGvC|Xx{yn`G3~6- zru6WX&)L*&A@e>G7Gat|BPHJdKxAV3axGDAI_)dlHR@`v7@sF*b&bTG3yFQq%Dyq~ zQ&y)oW8%`2y1W@%XmrDJo3r&s`C@Zcqs0I+N0-oiY16}6;sLFj`YSGwX}2g|Dm}rE zv}mBt$Yle~4ORyO;_)4roM-_bO{q-TQR0{~)ju&!$<+?He3h-{wqO}C;ub{P)E(Nr zWH$E`Oqda8VZg{Av*DbABru?!t_jc804H`0fFuFTcPf%@dK5*`Q$tLAh)Nkh(H=Jo6?K_k&x@cIe zZ?C(yW?8aFGq1ZKG@5+o|M9vY-t)xvUyz|&j9o2Z6wXvB-o&YFl(=~8%X_d~i$7B> z2Je}`>NR#T+!p^w4K563Qt%Ka#e&j7`Ji5)ksvo{0cbU7J7_=1QA#ELrp3)4HTa&e z4Ahoa?>^=N2J9cg#7yXoD@l3=BfOY+ZF(Sq z#@D8Y5{5Sf`XWb2;7I{DxCJ@**gixO-S_*Q}+cE?zi>N$19z z>Evi#_TYCCg=LqaXN)%!;fFvQ%h7WgBmMv8SB_<_n@VfU#BNJX7{l(Amu_RD&RD!4 z`F4ivRDE4wM4LM&P)myIfq&>1?6gk!2W?+>(K8T_ksh2}#~FhjzD+4E0|nt71)4qA z4O-!`5DWXiD#D7$xEZR3hPJq&Gv? zbLn3KGAQEXKbqomr1%sWG;Dyigy{-r&`i>Mn)GO6?@QRbv7btMvq=vdXU8utL&CpM z!sAJCE-8xL(Q$*`anc)3dh@I4xjgKvn9Q$y}&3vOxcWwK^)ATV$5 zxu4Z;Xvu)%;!gk3&6^a>aB~!*CG}=$w@hg#MKSmih%&V|YuebF(&bXTYQd1&7ZjD& zCUH3!MLyG;4Pmlpf!d=l%N4&1>GvT0Mn0h9J?M8K{T`&>$bPJoh&QAkYpNWhG{_kd z4j;0&r6232oT4BaM-B{J1jY4d8F-nH+OmZ}Xni4- z)IwdQYavu@OkdXMxec!sQu#`#gp&%bd|oRLl9dOc;vf}TOTAV|o0OniiD8_e+b_-;Ro{AHr(%5EdOQ>^Qow+|NDd z6V$##*cJA$+T$ViHG530HZcq5{EQMKJ`j}d8fX4C(B-F@ z6gG=V37|%xcA&nXF`#15BG6ip2Xp}Ba|2z-qxCb`GYB&}xpN3JeYtBsfkr2HAz?-* zcPU{;CwC=bMkn_b!m1hk)HQ_poLnqx8(1AZ*G4CIGbtLK+;^DvZJ-@m{YmacPVLiO zTR$Jp+OjI*J87CAtgd~NLx5AogAX6k@ZEXgL~ zsp%t`qP{SS;e&ObsIQJsGXT!qYNCUL_E-pHceWb|7R z%a++RwZ>>RMA^p@^WH?3XvP;iKldVa`Dhly4yf;r##s55Gz?E`LF2|~)=@c1L9~q* zlM;gZjbU#nzfzFFT}4pbShiF-OF=XlQIh+{;&SR03Zkiuf8pw{XTGRw(g9<=}pz)xYAYb3BAm7~gDiLPvd({Xt^}Q$pjeReUFk|1VL71`c z)gjE-_Zkpp?0Xr68T($ATt?q(MvBJ1*HYH{UYl0h2FsHfrGJC{?K)0%@pu-d^pF$X z1yPc?y5zV{Uk=Mu-yP3JC<7?Sc!O@Hn)3*2m7{&eQadleH$lA{!C|EDoz>9zNY8ha zrOkdt>Xt`X?Z%_csfsyCQ@yUcAL6bg@m3^#_e~S$<7$-&tdHx!E2d_5<0B>uK&wI9 zLHj|+L6<>ci!c>|8iCq@`htA9ol2FJWf$niZEldzfPF3+1HoV?3+l@*zDW%W`AFAc4@5E?6uUwNvyf@xt!>E8cl9EHkHPz zZ%tzTmG3FYu&I{DZcToaEoI8D6h>>X7~6<;a5CB?@HJDL}II3<|@CX%axbHaSZrF}BIygc;l98eyh3VFCI$HnvF+Va7J8NSLur?1UNHL?O)B zCeef$+ax}qjG=o{HJG6X{>Y8Rk{}3={f0rm{@sJ_?dBmL=LHyszRbJU!&RQ))jK zmIe1&b*hWSH!Pg)KVf-rI$96o_!^x!4I(q8NTGD9z72a{-REMRU85-I9|Zj~Rl9*R z?|m`E^#fF!jFhjH;;7EeY?J3V)Q0>dt-RXJpd#GomrN#G*I?_Kw;-@}&2LMK|F|As zst_Ql%iOHGGL<6UK*SsV{JB|;@Y${FI`)Phg!~b5@%=XW>g&13)uD z%Rn1JyFiCPr$N%oOsWQ|18N5HbwAoXXm_X03i0Z~VpgxB^e$e)a21PyEr9P#ulwAyHuZ8bYgy~8If`yA z8k4;~`HQn)&knWU3>GO%@2V4Kus+HKibA^x%D{;kOl=ro)AL5Fj-CNnqYEhF6Nus& zHjx?al)1CI{z>+fQiYIXWys~T(VV9&0sauCNo(gAt-FCI&~rI*Q(p#@d@3BjT%<;P)sGp19lr`!ffpYE8jjuC&9bWux{W4T` z*wn_Ma(|({FjQ^`?X91N%2RD3TKfn9h&ClcE|mAbp&pHp@m1orY6ZKTEH8UQO|wG= z-b={oZ>Vm&e0S`mH<%QPCntkh57tnU0*Bc!5ofhTa>Z-ZW6;Pxv_{wX5!DsU?z8>H z?u!@N=~6`-MZT&9bw^Nl3aU`^4Yglo*@^sYom5$VFAzE2+Snm~Ad8${j*`cToQ{l^ z-J&RGqV@{5o+cL7H7 zM##adaKKIS9>_C)#A|3t{vPtsNQ^*|e}sH;y+8g*AvebMn8L5fQdMbfh93wEkR;n+ zwL^WB^8#|en-tpt-`rN64E({%$NULS0d99oQX%OTLk=F`x5tH?jy)2EzXEyHa(#S> zir5bMvMZ=ahPJ?mL@E3Ogpc{jUzy)RmXiHtJqfuEz6H6O^#6uD z=NrGigfb7>>~CWQa?PI5r@m4f@-7s_J0@}~V2UbuP_36H$0ZJG<8Rf0P+WkF*(l;T z$m7*vX>tp8L47?tB!-$}GKL9Vrh)AG#O;Ozm>(qClS9w3)b99LC zNbFMks=uYn@huCmI(b{R9pD6v=-s4tKjbk3Q7|$;9P&!EbT)-Q4f&kfzM-5}rC9Pe z_>ogIoEdZ`0K7hg#QN)%|s4!}CH1CZiCPN;SwwD*MgUhP=883Pq_k zhJ5H63QGEIAQ#q9_hiVa_nt)ZUi=y0dA-nGs5A>8Z{LAoMe&wFUWN~G2BQr`o3DjD z=_~(qu?zBPwSA@>&n~OO@ROMSx_|O$5QZL*@9&t+ARkd*hg#QsyFc^80jHp_-bAMg zwdZkmK$)5a*@hLlj>wc8COr@Nq@l%MhP>)AHM)@;*KqHB{+@6cc>Yk>qDuJ28> z2Y?E95psz-tdSfquimK6Y9!~ncF(}hgM#nJD!vWF(3`E{VpSi9C=~uM9Xvv<~hLA6aDf_kjJ>y=)2_HjIfDl zB`U``;JdH{d&@0jQ?u%jf2xfZatn3VU6{tk$NKwdH{fHQ@yq=oAOF^$&xw%FJ&fBh zs9C2$-qqS)zY8FD&qaMv{k#U*iH_;b$3`KyM}1TLT@g|%Db|T2N6PqjP?(binGBqU zJSoCo;46^#_VUX?b}=M}Wufy9QlG|8(#!|2GLrdT2t9rS!;Y+tfV??W-IIk`d~Z|r zRF<47yN{{S*=Viq=&dtJ?>zJd^;SCwd>Ne6Mgm8#jlxBPMl;mOz-4s1CHNiOcdNge zA4GV1bF5%w=V8d>TltGW1M;~J*jL!}q4+%H{a6*Ikp4@MyUg|vwvCWa-X%WHUA>7M zld*A|KdD0qT6M2~f%p@0Hd+QM`pjMh3(jJ7coVd6wRk_C4SXY7#H-gCvb)exviXtq9Tr=F?88$$k2WxXEd^_YqLk7NteB=rmp61tI zAs3&5YezM5&IQ1B4qrVd0~M-a(l8i^fqeOU|0I$E`Q#)1MYjp$V$7XdeDuOrki&Yz zr6hX=kT)KOO-isIWE=c)4~0h-i3m^l*T1JB@4ckr6E4xN72qdb_b0v?a-M!Dk?cVaoLm;1wc#0EiOY0C}?^ z!yiK~Sb_5lt-&(Gq$2>PU?nYZg#hCJR^0!4B{&d1EQj11I*+^au)9?D>2$j1#e)&_FA zq2+ss@ClfHDgH3Xo+RozE>y{M0F4~}#c=`Ta|VO2LGFbQjqfD`n;~yAlyC=RHzt}% z6#fO|;6CskN&XJmSJ7gZ+KX8I9VU;~z_Lkmng{uomQvhN-^=)|eGDggIgIBBF7m=C${6#u5;CCITj5=tP0TOg+x3iJi!e0W4FDf~F( zLztet_Wp*v+pv6Bh{3w@Dz5)&>0uDm1h6|7wM+(bARo{1_sNcs*JAbbHu3$js6j&p zdL!K3QkL9^Us-ZU10d%c!Y4y+_JhBR%!k~iDdLFq#2{D-U`m|73O5M_gMrc7US{Z%mmps-G+6{P+zcD&6p2M1$o}R{>5+wAk55j5GG2jKu*~2-yq%vc`Y2K zZAf2JxEp}fO4giq(T05?58dZm)1^_6=NK~NhTQ0D|EQY-c_j{A3MfGp@*;!&YRKEL z2X#~Udyum+YL_8>Edw6|$j|g2z#W8~f??=2cm(osI3c@9|19KdzBYGAavYi~&p(V6 z$nI7CQIiGvoMEkM19{skn1nWy!F~X?<0#8JjweIDmg*lyGetONt-Ykb0`e+D3EzSo z_6X(;n_i&zAa68;?}c1^pMSCZ5%S6bxMen$7PF;6u#64lN=o1y6td6yhYgEIz^^b$ z;USO_XK{_xh2!*&!w;b}InOi5fksqj1X~N*~qx+8=JY?{=!9@eNe%VWI z60kM4ul#Vut@9p|_cD3VWVPQgIW9;kY~+^3Z@`9;ci`9-pHmM?e4)N%Y= zSQH)Xk;LD)P|5B%UtBak#3MBb_Bg#44e`$){&()vWq;tioUv`rAlG2eQO9@q8-l+V z@HYs5f5BfH{+`EQhQCNvk@5E@{FU(cT=8kgkAy^7#ME=n>&k|9NxGLT##~B_HlU)8x;b}yK zUAveqobQT>m%{NG43k~E_^{YotUK>mHHq)+P?gtS6v2yPgXJOV{H5Hg;mWQ2B3qEepjV+v zvOFT4f83}l?_8y_JT9FVW+(D_RqD%A)A^>_Re4dBdbytMPRa2{VNtcp9uy$a?zokI z+O^9mrBw8IbQ}dFEO%CU(Y+q6;bx!&Eu*#QH&FL*G}mn!$@BU8s%@E#*N&^ftHwoW zTsu+ni*cR!CvnL-`>0Li!!OmXRz}zy1U?`snlFkk2vbMtrn!WliO*!Kd1OK={?En# zZ}LYIp7)2p#V;mgvYk9Gu@?I$Z=0A5esp4E_AkCZF<17~&^4+{a zQdfC@I{&WQHfb-z@czT5rHO`CS56m@+Bl{vh=l{s1`9cSkGWpF#lDF;V)Km%BRx#Th&tJ?>F$zt351x z#_^=;t>mksR*8|KWuv4OqPOg}M2UH}^X1hu<=e*4sg_VC@q^WqD(O+D83LVJmbDjE z;tNx%yZ`kvf@V0y%#%ApvM*~TNn=6cub_zr-iO`q@AOji7g)k8S`%Bq+oU#>Lu&KP zE=ghaCCQec8UM!A=x|}2Bpx)27gHaX%h%>(nkDkdH6D?pYxB3OR^^v!*n_;Ept`wf zymrkpL9RVc{!-lxUVg2eKV36Rj?>ll*7U1|zlj098X4-E>dB{BSzeGj=!I_DMacYB1!wUPN)^mWT`)&mVTYp=X5K_@kv?TMTEmyU1aZzJSAIYowfXXBmZal6LliWh%&h91@rujjbU3+uPvfpD9ci6 zh`g{FKrtME#?@=77nFz11~`jUdDx4P=4sOM`lOP|%Qtw+SFPZj8f*d2$Z1!7$UF8B znU=Dl@7T53`A#ur=JE+Bwmv(L;LCIR%bp+kot(LB1)tM!w9R#kHsOc<$Padf7HjS6D9sGyJgXP_| zdAlZe+ntTmimtS4>RNLAzzc&l_NFmxN z_x9Vm-qnh+JIE%US8Uc7liTQKb(w?56~y!Ro8^dl-fUJ2d8Ra*t5?YD8XRAcERx8)5t>UA#EUzKU z>&7hk!B(~8Z6d=sUb*!=c~1s!7gKfX-qz)r{2%078Ka_2Q~AdX-nd^}sMVf0i6FgQ$jh_u3 zU9Iu+z~3bPCElP@X7yJ#1x5i!sPIuR3LJkLe3V6ePNyWI(yfR5VyN^t zPQ7?qpA?%&o4cx4;}iP~Vk7ynK5?1CY0xdnDRrY!rLWbnFq^P2!~8uqOL!~%Xy3~G z#YPc|X0a2p^u5F#Q49BJ8?V^0QmTlx@PSjSjcFvLUy|l8h*ol3qk%e>=l08}&>jh; zlq0vv!zc91h|nN7d%6#prHz?G{X%s-jPMt;gfAMR=`7;m{VgdiwH@O9JYq< z>YvHh^Yi^5jr9IrMvA+gZ-;HebC>K=9`8S(tGp#kn+y*P2$SE-;>QQHi54{$rBbLJ zv|LgCfg{U$fB-%a2W%#Cn8{H|wBMSH~`#h3#0(1#vn<`08P&&v3>INDCnhaV1 zS`8A0p{4#&*4^9J1B4m3uU`^I+gG<1`6z+L{p(4>jQiI!gcA8r6w=0i$${M*X+Juoam{pt zb_Ft|4AK@Gu`_<{kA~#Kc?ubttmIJmX@sA4!*>XikaynDe3s9r49!to6kdezB7gY) zq47#v3i%cx-}+O&GqkJHi9)_X$T$9wVZ)lUo_zhV{Mx;#oJx>n!=70z3|hYqqIky; z@0k1aUcDWnho@$bq>!TsIqFL>RB{~Eci7&yz~eyRfLLna2zW;E(Ze%jX%$~S+~IzT zBA-Cy6Z(k(dPH)Z&?AR9X#JW*ddH!6+>ps}(koA{)^PpQK+EW@Xi51R`k)HI9?9`F z=E800%EJN!pW={sy%9Ciyx9)P0noXu&>mOOHy==jC!u`OS1>+vL~`Qu*@@mevZS@j z4AMFUty8{Y@%I@nJ@|)|d?7Ii! ze8P-_aS>sr!MK#b8ioX4C(Jk)R}*F&jOz$94#tgy83*H5!iNM#N|>{54v5DLSnfEsP0D8v|2$#^Wu+rFfeZ!X(L?#HT#|mF%6%yN~Kr z{VeHY!FT-W(}zL*sT+#6AfD#?N7YG@E{N&Vu;>4oqGF|Y+$0m9%9Ea$aJT9eQWf3_ z&IPp5FqQ9lA}&KuHPP<+%98pWib9(miV{Bh+5F%w_K*r>zaiku5+4dal=yPs(Qw*2 zUje*tYhmAFR~Jl&uW)X(;-0_CWOLo-OVU8lD9}XEbkG9OGLV)~BoabbYJ3#K1E8azv!F|$+n~@_FbY5k zpmb0}Pywhjs4r*)XgtURng?0}S`FF^+6~$VIsz&JT>#wx*|;RR?f9<>s0OGW$OUQ- z>IoVG8Vi~Xngv=2S^?Ss+6meVIs`faItRJ}g7YDj135v}Kv|$Bpw^&npn;%KpoyUA z3njO-0L(JbTF^F-7jyu06m%AJ33MA2x(F=*N&uyU8iEQyok4v;BS7Op9?(3{63}YU zX3%cXKF|?R5$FQw2FSM94bNgRS^!i7R1f3=wFmVC4FQb>O$N;ZEd;FqZ2;{A?FAhI zodBH!T>(idS^(q(RRd*#nt)n^x`76QMu8@Rrn~Xq0?;zhTF^F-7jyu06m%AJ33MA2 zx&$o%N&uyU8iEQyok4v;BS7Op9?(3{63}YUX3%cXKF|?R5$FQw2FPuD6)ga&0;&P3 z2XcYhgL;C7fX0F*gJyvif>wYwfOdlRf)0UBfX;!gfTX2p0gz_x)nNLHSPVRptp@l= z;%kGCkllJfJqYC}pb_{m;`6~{;AoLsfDaD!x=vT{H;L~B{yOmkz+WN$ zQSiSJKhzE3A_*hG|4jU7@aKph2mX8FCxAag{3P(-67KcpLot#BT<_hxmVj{}=HefZs{{C*Zde ze+c{*;=kTvcZX~u;S>Tk5Pt^zI^ur-zlQkp;8ziU5&R0`uY&(O@wdS*C7x}yhp5Dd zfL};_S@17wyj!x_Ajo}zX*JD;{OibMf_^;4-vl}d@k{u!RHXa9eh3F zcY)7l61F5TKre(03it?oE#misuR;9h;Hwk=CHN%bzX2al{7LXth(80qGVwoxk0$;i z_)5fI-Ric7*h%;k0p*Dg-ewO8C%!!RGQ=z3ZNygv&xo%M{titzHNoE^zBc$9#Ak!Q zN_;)=mj&-e?Q8OV#CHdOlK4L0j}hMw{MW=k z3jPT3!@;}1AYl}QgT#*m|0(ek!S5sfIq)A6KMni`#Los_Nc?>8yNO=}{-4Az1OG1Z zuY=#J^KRQp2%9Nj9r$;M-wb{|@!P?_Mf@)CtBKzO{te>yf?rPje()s!gTYTC zJ{rk2p7mtzAgB!;I;X`6NJtb&<%VC;(LQ{OZ-6acod?w#8B`B#E%5ul=!jW^N61SzA^F7 zf^SH?2Yh|vU)YZMzYYoW5Rggy%izd#I^@?v9-@x5@qeZ1tAY#A4v3bSC30Fy1)Y+yka>?|;w1&jX0sRUcF*1$r% zc70m)Wjq;R8H?gdV4)UlAFwbBb{$x_1*>||sg$)~lYVt7<@}giuki|i<^7#68&v8?)<|2Dwd7R8wBP9?*FbpV!W!JY$_Wx?J7mTkd41y;v^ zxy5+D1+cCG6j-erPNkj&YXhvl1se{mfdx~6GSWRH= z_7<=&zz!B{Iekiz+o1}r-2Q( zV9h^tDkCh|P+*T)uqD7oTCl^w9yeod+kuaq$|y5vI|u9u3l{ycQyFc+762P#!S(iBp;A!`$R@ zwFCH!4QQ>WswVC4=t zm8ll20N6AOHUZf47OW}qm~O$Q1Dj#>|Mmc!X;J(Y*b5eH88Vq=!Hxr)ZNVy`#&axK z3t)5o82NvW&z;IVKdAeEU4Xr4!Da%RZ^5TwlJ4b|*E@q(nT`X$|U z3!aMf&UHu?WL(Tx6)J^P!c&7zJmckP*|n3md^y7gO^Ii%Zq2NV>47W zZe0vdxP)W>uIj-U)|+R&5!Kw3sDg*Gh+?|^IF6DsJy*oj%iH?XOYe+up1H89G0nE7 zG@IyY`k&fAYi?z|Xh;uNp2dZHk$(}M%g5Pq$-Wa`%HvX`Rl!n78A~!Vk<9#X?P+T+ z4y|2p@>ATAJ^S5kWTfBjTO2Nlt1SMEUo5F2eAgQ(qH{Vf>@99Ru3wm`yi%gx#f1UA zqSEzFEqYY;-r&s^r~1<~Kf|4}I7RE+{PZ~f;o^pguTidKI{s!6Mv7)}74kS$D?x>e zof22xU)g(rl-2q1tP9Ut66G>=NhI3R*fMWXawcmDJfKDw!?M&U(Z@)zN7ANJ^@U0J zZMV&M7mYNZuY4`F{y*OhoSE%<7Zs1NJFehugWu?K(|gpMxIpK) z>VI;7=e6izu1-!VZYeJMUoI?K5sIr}(crI$i*mt|e*4N`-+L(;x>e@4AY4|}2A0<2 z5#s2M**?+6iI$dYF`u+7pB)slP?|Q^()>tst>n0_ClFE{W`m1~aj}x!vxMJV78mVV zf^vuplvi+p@^T^WYPp#0lt?L8OG#Y!yJ5KTaD!69$s$rZ?YM$j_%~qVf+6d?YbKxa zcQ?Bv5_wch>|M zVr9(JDo2I!xAje57odB%z$&= zh*eTao2L8%ef6N3vcko--2RVH**k+@+!RC0PV4IYnU!^A591qGMvFfmt*jN6u>-aq zW-kcgQ`X10wd%r-9hVJ#d6^6XN6O-*90fCwm~FIE}6%NMA@iLK3z>Mtg(qgd;Xt;>`Kpgf< zn|SV;y0{-VdQDOlO_>VfSEkEFG;jM#QFCBvrND%fh6dlMr9X_1ek-Z-{n9t~lz*jt zf-@bm( zbxLoB^8wp&wMDpVeb^iP;ybCzn*T-iRYua8kA(^f>7t1yZAJ4YLr=Z){ib|@l! zazp%6F1aDvSgC{MSu`cQ37?&b_X2ZgmC?NltU}_srnHam+2&AuB`{4B{QS1&@{iiY zt&e0XpFS7!jXU(k1=YBuRpZ)!S&iHOvufzCGg_)~Nvnph1b0_Mo*3A*mskyqJQ=U7 z{rXOd646liOCGR0Iyy=Jzw8c|_9~{i9^$RJ!fnz1BHUe(r2AFGw^{BfyqJT9F~WY9 z?=soX^7mqs>XcML3^l{n7xU2rCf4YGGqI)*l$fZNnC$cP{%TuNB;WAC1~|ymOjqo3 zFU69o8n?BN+*yy;`(E*U1!<-04Z4?}HGQir($NaqTTf`zy%O?eI6&7Me?L7@ff2gi zv-i>Sd)oIu-k45Fm@G2jNcfL8aE=3)ugix?Y2v-*yPTHUC6;9Qhp{R1cbbkk?m8IZ zh&ex;yO&qjTdOVa{85x~W*q%doIzAK)?l&8YDw9dEM4;+eEredW^~Ltew05|XALofe#qAqb$K+Jtl8!@n({(R>1;sXPW%;}N=695y z!Mj>$TfeWlhE!=%DbO-P$$eW*?BO(T<89KT&8@D-U-<-UM@zoz6KxY%;bMEfoIY+)iKfSxU*l*rK@J5W$gm$L4Vd*W{ZTG|IAD{lHw|>F^dkQ%%-Lo2x|~+35Qx z^|3jry*~3WOyTuoF_cDz#MpD8^uV}E_F^Nfx7zDrl9`uYnjQC*wK zT)f6t75SnsD;bNl<;xu9cS^#vU*>ndOp;NWq$4?U$TI;SfXYp!nRcYB>@Ne7y1M^0^|9@)LZ~9Nu1SST)Y=^p z>l+;Y`DP4dWa(=lPu-F#W${w@!5uYvKO9Kocy|zvEU7kCM(k@Jt~6Up?vgF zoa=YuGmqAl7Z}P(iwd>(nWH)KN-b1BT)D?tQb;t0mw4U*o0FP{+`ZPkOGUWHUQQep z`#YyltE63=X1Q>{Zo^DxV;-Kf5HIJE@$qxtj55};|FOo(hm?h>d-%p-T_sJQj z1|IUoQ(nQjCHT|kX^-l4@RZ3{ZTW3-a@kTN`|>J%(u^uKE#D)bj=9Wq zD0;CdIk^hOzJ~{7@Ep{VqE~w{+3Tp0ORZr!wu$`hLp}==+Z(OUt^OIjK^!?r+xrD_IXWCsk_JPnz}r zO4gIiNtK%QbhG|_vY!9bNX@tKx%tu83$-T;FMXWDE3AwY=flY_Qfl`&G&OWLUw(eH z*?*p6aiA7ZTIM-2@8{?m+L^~V{mesK5WDGoN*8>`Y#SB_ZSpNFQaxo@^{~aev=jX4 zmBb0Yezsv=g1-7W2VW1UZ~-4Q5O2hqRv_N&LJoVEPx1xQ@6iZ^rTe?q*GfytcQK&!1*iCdlG1jcs(m;<^|S4Ad!vgH{(Gzv+E`yb@fgW*$^T?0 z_xI-bsL7Py$v}TYARfDt4Q~0pzizjt$5K4$N@k0?l$yy&hSB&QD#1F%$4|7|67Yhh zvxe{H!Ov3QZ+VLN;wyvYrq2evY4hMox;jAaX9zWqp7mF?9jLI$NmQ89r-ss-+D&Ph zhF6KBA@2GVV;irzo|-(9B2!8IGafy)^vzK|ryN$~XQICvLSg`y;>h>!el*YLzDIU#}2b!AecEhuXGa^g+aK{lW7Z zU&ModydvU1dNUc56D3Ai?yY#`ACzVk(v0$@$w%LEu=j;_l4~b!jzmn>pHdtkWd+KL zU-_e3`qQIZos#}T3Z|0|l#rg**_IXZPG<+*f2luCX_W4w=uaQdma6~2OZ|mXlk)jD zde&D<)qmiu|132rbJn&d`Ut;wD?RX