#include "ToString.h" #include "network_utils.h" namespace sls { std::string ToString(const slsDetectorDefs::ROI &roi) { std::ostringstream oss; oss << '[' << roi.xmin << ", " << roi.xmax << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::ROI &roi) { return os << ToString(roi); } std::string ToString(const slsDetectorDefs::rxParameters &r) { std::ostringstream oss; oss << '[' << "detType:" << r.detType << std::endl << "numberOfDetector.x:" << r.numberOfDetector.x << std::endl << "numberOfDetector.y:" << r.numberOfDetector.y << std::endl << "moduleId:" << r.moduleId << std::endl << "hostname:" << r.hostname << std::endl << "udpInterfaces:" << r.udpInterfaces << std::endl << "udp_dstport:" << r.udp_dstport << std::endl << "udp_dstip:" << sls::IpAddr(r.udp_dstip) << std::endl << "udp_dstmac:" << sls::MacAddr(r.udp_dstmac) << std::endl << "udp_dstport2:" << r.udp_dstport2 << std::endl << "udp_dstip2:" << sls::IpAddr(r.udp_dstip2) << std::endl << "udp_dstmac2:" << sls::MacAddr(r.udp_dstmac2) << std::endl << "frames:" << r.frames << std::endl << "triggers:" << r.triggers << std::endl << "bursts:" << r.bursts << std::endl << "analogSamples:" << r.analogSamples << std::endl << "digitalSamples:" << r.digitalSamples << std::endl << "expTimeNs:" << r.expTimeNs << std::endl << "periodNs:" << r.periodNs << std::endl << "subExpTimeNs:" << r.subExpTimeNs << std::endl << "subDeadTimeNs:" << r.subDeadTimeNs << std::endl << "activate:" << r.activate << std::endl << "quad:" << r.quad << std::endl << "dynamicRange:" << r.dynamicRange << std::endl << "timMode:" << r.timMode << std::endl << "tenGiga:" << r.tenGiga << std::endl << "roMode:" << r.roMode << std::endl << "adcMask:" << r.adcMask << std::endl << "adc10gMask:" << r.adc10gMask << std::endl << "roi.xmin:" << r.roi.xmin << std::endl << "roi.xmax:" << r.roi.xmax << std::endl << "countermask:" << r.countermask << std::endl << "burstType:" << r.burstType << std::endl << "exptime1:" << r.expTime1Ns << std::endl << "exptime2:" << r.expTime2Ns << std::endl << "exptime3:" << r.expTime3Ns << std::endl << "gateDelay1:" << r.gateDelay1Ns << std::endl << "gateDelay2:" << r.gateDelay2Ns << std::endl << "gateDelay3:" << r.gateDelay3Ns << std::endl << "gates:" << r.gates << std::endl << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::rxParameters &r) { return os << ToString(r); } std::string ToString(const slsDetectorDefs::patternParameters &r) { std::ostringstream oss; oss << '[' << std::setfill('0') << std::endl; int addr_width = 4; int word_width = 16; for (int i = 0; i < MAX_PATTERN_LENGTH; ++i) { if (r.word[i] != 0) { oss << "patword " << ToStringHex(i, addr_width) << " " << ToStringHex(r.word[i], word_width) << std::endl; } } oss << "patioctrl " << ToStringHex(r.patioctrl, word_width) << std::endl << "patlimits " << ToStringHex(r.patlimits[0], addr_width) << " " << ToStringHex(r.patlimits[1], addr_width) << std::endl << "patloop0 " << ToStringHex(r.patloop[0], addr_width) << " " << ToStringHex(r.patloop[1], addr_width) << std::endl << "patnloop0 " << r.patnloop[0] << std::endl << "patloop1 " << ToStringHex(r.patloop[2], addr_width) << " " << ToStringHex(r.patloop[3], addr_width) << std::endl << "patnloop1 " << r.patnloop[1] << std::endl << "patloop2 " << ToStringHex(r.patloop[4], addr_width) << " " << ToStringHex(r.patloop[5], addr_width) << std::endl << "patnloop2 " << r.patnloop[2] << std::endl << "patwait0 " << ToStringHex(r.patwait[0], addr_width) << std::endl << "patwaittime0 " << r.patwaittime[0] << std::endl << "patwait1 " << ToStringHex(r.patwait[1], addr_width) << std::endl << "patwaittime1 " << r.patwaittime[1] << std::endl << "patwait2 " << ToStringHex(r.patwait[2], addr_width) << std::endl << "patwaittime2 " << r.patwaittime[2] << std::endl << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::patternParameters &r) { return os << ToString(r); } std::string ToString(const slsDetectorDefs::scanParameters &r) { std::ostringstream oss; oss << '['; if (r.enable) { oss << "enabled" << std::endl << "dac " << ToString(r.dacInd) << std::endl << "start " << r.startOffset << std::endl << "stop " << r.stopOffset << std::endl << "step " << r.stepSize << std::endl << "settleTime " << ToString(std::chrono::nanoseconds{r.dacSettleTime_ns}) << std::endl; } else { oss << "disabled"; } oss << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::scanParameters &r) { return os << ToString(r); } std::string ToString(const defs::runStatus s) { switch (s) { case defs::ERROR: return std::string("error"); case defs::WAITING: return std::string("waiting"); case defs::RUNNING: return std::string("running"); case defs::TRANSMITTING: return std::string("transmitting"); case defs::RUN_FINISHED: return std::string("finished"); case defs::STOPPED: return std::string("stopped"); default: return std::string("idle"); } } std::string ToString(const defs::detectorType s) { switch (s) { case defs::EIGER: return std::string("Eiger"); case defs::GOTTHARD: return std::string("Gotthard"); case defs::JUNGFRAU: return std::string("Jungfrau"); case defs::CHIPTESTBOARD: return std::string("ChipTestBoard"); case defs::MOENCH: return std::string("Moench"); case defs::MYTHEN3: return std::string("Mythen3"); case defs::GOTTHARD2: return std::string("Gotthard2"); default: return std::string("Unknown"); } } std::string ToString(const defs::detectorSettings s) { switch (s) { case defs::STANDARD: return std::string("standard"); case defs::FAST: return std::string("fast"); case defs::HIGHGAIN: return std::string("highgain"); case defs::DYNAMICGAIN: return std::string("dynamicgain"); case defs::LOWGAIN: return std::string("lowgain"); case defs::MEDIUMGAIN: return std::string("mediumgain"); case defs::VERYHIGHGAIN: return std::string("veryhighgain"); case defs::DYNAMICHG0: return std::string("dynamichg0"); case defs::FIXGAIN1: return std::string("fixgain1"); case defs::FIXGAIN2: return std::string("fixgain2"); case defs::FORCESWITCHG1: return std::string("forceswitchg1"); case defs::FORCESWITCHG2: return std::string("forceswitchg2"); case defs::VERYLOWGAIN: return std::string("verylowgain"); case defs::G1_HIGHGAIN: return std::string("g1_hg"); case defs::G1_LOWGAIN: return std::string("g1_lg"); case defs::G2_HIGHCAP_HIGHGAIN: return std::string("g2_hc_hg"); case defs::G2_HIGHCAP_LOWGAIN: return std::string("g2_hc_lg"); case defs::G2_LOWCAP_HIGHGAIN: return std::string("g2_lc_hg"); case defs::G2_LOWCAP_LOWGAIN: return std::string("g2_lc_lg"); case defs::G4_HIGHGAIN: return std::string("g4_hg"); case defs::G4_LOWGAIN: return std::string("g4_lg"); case defs::UNDEFINED: return std::string("undefined"); case defs::UNINITIALIZED: return std::string("uninitialized"); default: return std::string("Unknown"); } } std::string ToString(const defs::speedLevel s) { switch (s) { case defs::FULL_SPEED: return std::string("full_speed"); case defs::HALF_SPEED: return std::string("half_speed"); case defs::QUARTER_SPEED: return std::string("quarter_speed"); default: return std::string("Unknown"); } } std::string ToString(const defs::timingMode s) { switch (s) { case defs::AUTO_TIMING: return std::string("auto"); case defs::TRIGGER_EXPOSURE: return std::string("trigger"); case defs::GATED: return std::string("gating"); case defs::BURST_TRIGGER: return std::string("burst_trigger"); case defs::TRIGGER_GATED: return std::string("trigger_gating"); default: return std::string("Unknown"); } } std::string ToString(const defs::frameDiscardPolicy s) { switch (s) { case defs::NO_DISCARD: return std::string("nodiscard"); case defs::DISCARD_EMPTY_FRAMES: return std::string("discardempty"); case defs::DISCARD_PARTIAL_FRAMES: return std::string("discardpartial"); default: return std::string("Unknown"); } } std::string ToString(const defs::fileFormat s) { switch (s) { case defs::HDF5: return std::string("hdf5"); case defs::BINARY: return std::string("binary"); default: return std::string("Unknown"); } } std::string ToString(const defs::externalSignalFlag s) { switch (s) { case defs::TRIGGER_IN_RISING_EDGE: return std::string("trigger_in_rising_edge"); case defs::TRIGGER_IN_FALLING_EDGE: return std::string("trigger_in_falling_edge"); case defs::INVERSION_ON: return std::string("inversion_on"); case defs::INVERSION_OFF: return std::string("inversion_off"); default: return std::string("Unknown"); } } std::string ToString(const defs::readoutMode s) { switch (s) { case defs::ANALOG_ONLY: return std::string("analog"); case defs::DIGITAL_ONLY: return std::string("digital"); case defs::ANALOG_AND_DIGITAL: return std::string("analog_digital"); default: return std::string("Unknown"); } } std::string ToString(const defs::frameModeType s) { switch (s) { case defs::PEDESTAL: return std::string("pedestal"); case defs::NEW_PEDESTAL: return std::string("newpedestal"); case defs::FLATFIELD: return std::string("flatfield"); case defs::NEW_FLATFIELD: return std::string("newflatfield"); default: return std::string("Unknown"); } } std::string ToString(const defs::detectorModeType s) { switch (s) { case defs::COUNTING: return std::string("counting"); case defs::INTERPOLATING: return std::string("interpolating"); case defs::ANALOG: return std::string("analog"); default: return std::string("Unknown"); } } std::string ToString(const defs::dacIndex s) { switch (s) { case defs::DAC_0: return std::string("dac 0"); case defs::DAC_1: return std::string("dac 1"); case defs::DAC_2: return std::string("dac 2"); case defs::DAC_3: return std::string("dac 3"); case defs::DAC_4: return std::string("dac 4"); case defs::DAC_5: return std::string("dac 5"); case defs::DAC_6: return std::string("dac 6"); case defs::DAC_7: return std::string("dac 7"); case defs::DAC_8: return std::string("dac 8"); case defs::DAC_9: return std::string("dac 9"); case defs::DAC_10: return std::string("dac 10"); case defs::DAC_11: return std::string("dac 11"); case defs::DAC_12: return std::string("dac 12"); case defs::DAC_13: return std::string("dac 13"); case defs::DAC_14: return std::string("dac 14"); case defs::DAC_15: return std::string("dac 15"); case defs::DAC_16: return std::string("dac 16"); case defs::DAC_17: return std::string("dac 17"); case defs::VSVP: return std::string("vsvp"); case defs::VTRIM: return std::string("vtrim"); case defs::VRPREAMP: return std::string("vrpreamp"); case defs::VRSHAPER: return std::string("vrshaper"); case defs::VSVN: return std::string("vsvn"); case defs::VTGSTV: return std::string("vtgstv"); case defs::VCMP_LL: return std::string("vcmp_ll"); case defs::VCMP_LR: return std::string("vcmp_lr"); case defs::VCAL: return std::string("vcal"); case defs::VCMP_RL: return std::string("vcmp_rl"); case defs::RXB_RB: return std::string("rxb_rb"); case defs::RXB_LB: return std::string("rxb_lb"); case defs::VCMP_RR: return std::string("vcmp_rr"); case defs::VCP: return std::string("vcp"); case defs::VCN: return std::string("vcn"); case defs::VISHAPER: return std::string("vishaper"); case defs::VTHRESHOLD: return std::string("vthreshold"); case defs::VREF_DS: return std::string("vref_ds"); case defs::VCASCN_PB: return std::string("vcascn_pb"); case defs::VCASCP_PB: return std::string("vcascp_pb"); case defs::VOUT_CM: return std::string("vout_cm"); case defs::VCASC_OUT: return std::string("vcasc_out"); case defs::VIN_CM: return std::string("vin_cm"); case defs::VREF_COMP: return std::string("vref_comp"); case defs::IB_TESTC: return std::string("ib_test_c"); case defs::VB_COMP: return std::string("vb_comp"); case defs::VDD_PROT: return std::string("vdd_prot"); case defs::VIN_COM: return std::string("vin_com"); case defs::VREF_PRECH: return std::string("vref_prech"); case defs::VB_PIXBUF: return std::string("vb_pixbuf"); case defs::VB_DS: return std::string("vb_ds"); case defs::VREF_H_ADC: return std::string("vref_h_adc"); case defs::VB_COMP_FE: return std::string("vb_comp_fe"); case defs::VB_COMP_ADC: return std::string("vb_comp_adc"); case defs::VCOM_CDS: return std::string("vcom_cds"); case defs::VREF_RSTORE: return std::string("vref_rstore"); case defs::VB_OPA_1ST: return std::string("vb_opa_1st"); case defs::VREF_COMP_FE: return std::string("vref_comp_fe"); case defs::VCOM_ADC1: return std::string("vcom_adc1"); case defs::VREF_L_ADC: return std::string("vref_l_adc"); case defs::VREF_CDS: return std::string("vref_cds"); case defs::VB_CS: return std::string("vb_cs"); case defs::VB_OPA_FD: return std::string("vb_opa_fd"); case defs::VCOM_ADC2: return std::string("vcom_adc2"); case defs::VCASSH: return std::string("vcassh"); case defs::VTH2: return std::string("vth2"); case defs::VRSHAPER_N: return std::string("vrshaper_n"); case defs::VIPRE_OUT: return std::string("vipre_out"); case defs::VTH3: return std::string("vth3"); case defs::VTH1: return std::string("vth1"); case defs::VICIN: return std::string("vicin"); case defs::VCAS: return std::string("vcas"); case defs::VCAL_N: return std::string("vcal_n"); case defs::VIPRE: return std::string("vipre"); case defs::VCAL_P: return std::string("vcal_p"); case defs::VDCSH: return std::string("vdcsh"); case defs::VBP_COLBUF: return std::string("vbp_colbuf"); case defs::VB_SDA: return std::string("vb_sda"); case defs::VCASC_SFP: return std::string("vcasc_sfp"); case defs::VIPRE_CDS: return std::string("vipre_cds"); case defs::IBIAS_SFP: return std::string("ibias_sfp"); case defs::TRIMBIT_SCAN: return std::string("trimbit_scan"); case defs::HIGH_VOLTAGE: return std::string("highvoltage"); case defs::IO_DELAY: return std::string("iodelay"); default: return std::string("Unknown"); } } std::string ToString(const std::vector &vec) { std::ostringstream os; os << '['; if (!vec.empty()) { auto it = vec.begin(); os << ToString(*it++); while (it != vec.end()) os << ", " << ToString(*it++); } os << ']'; return os.str(); } std::string ToString(const defs::burstMode s) { switch (s) { case defs::BURST_OFF: return std::string("off"); case defs::BURST_INTERNAL: return std::string("internal"); case defs::BURST_EXTERNAL: return std::string("external"); default: return std::string("Unknown"); } } std::string ToString(const defs::timingSourceType s) { switch (s) { case defs::TIMING_INTERNAL: return std::string("internal"); case defs::TIMING_EXTERNAL: return std::string("external"); default: return std::string("Unknown"); } } const std::string &ToString(const std::string &s) { return s; } template <> defs::detectorType StringTo(const std::string &s) { if (s == "Eiger") return defs::EIGER; if (s == "Gotthard") return defs::GOTTHARD; if (s == "Jungfrau") return defs::JUNGFRAU; if (s == "ChipTestBoard") return defs::CHIPTESTBOARD; if (s == "Moench") return defs::MOENCH; if (s == "Mythen3") return defs::MYTHEN3; if (s == "Gotthard2") return defs::GOTTHARD2; throw sls::RuntimeError("Unknown detector type " + s); } template <> defs::detectorSettings StringTo(const std::string &s) { if (s == "standard") return defs::STANDARD; if (s == "fast") return defs::FAST; if (s == "highgain") return defs::HIGHGAIN; if (s == "dynamicgain") return defs::DYNAMICGAIN; if (s == "lowgain") return defs::LOWGAIN; if (s == "mediumgain") return defs::MEDIUMGAIN; if (s == "veryhighgain") return defs::VERYHIGHGAIN; if (s == "dynamichg0") return defs::DYNAMICHG0; if (s == "fixgain1") return defs::FIXGAIN1; if (s == "fixgain2") return defs::FIXGAIN2; if (s == "forceswitchg1") return defs::FORCESWITCHG1; if (s == "forceswitchg2") return defs::FORCESWITCHG2; if (s == "verylowgain") return defs::VERYLOWGAIN; if (s == "g1_hg") return defs::G1_HIGHGAIN; if (s == "g1_lg") return defs::G1_LOWGAIN; if (s == "g2_hc_hg") return defs::G2_HIGHCAP_HIGHGAIN; if (s == "g2_hc_lg") return defs::G2_HIGHCAP_LOWGAIN; if (s == "g2_lc_hg") return defs::G2_LOWCAP_HIGHGAIN; if (s == "g2_lc_lg") return defs::G2_LOWCAP_LOWGAIN; if (s == "g4_hg") return defs::G4_HIGHGAIN; if (s == "g4_lg") return defs::G4_LOWGAIN; throw sls::RuntimeError("Unknown setting " + s); } template <> defs::speedLevel StringTo(const std::string &s) { if (s == "full_speed") return defs::FULL_SPEED; if (s == "half_speed") return defs::HALF_SPEED; if (s == "quarter_speed") return defs::QUARTER_SPEED; throw sls::RuntimeError("Unknown speed " + s); } template <> defs::timingMode StringTo(const std::string &s) { if (s == "auto") return defs::AUTO_TIMING; if (s == "trigger") return defs::TRIGGER_EXPOSURE; if (s == "gating") return defs::GATED; if (s == "burst_trigger") return defs::BURST_TRIGGER; if (s == "trigger_gating") return defs::TRIGGER_GATED; throw sls::RuntimeError("Unknown timing mode " + s); } template <> defs::frameDiscardPolicy StringTo(const std::string &s) { if (s == "nodiscard") return defs::NO_DISCARD; if (s == "discardempty") return defs::DISCARD_EMPTY_FRAMES; if (s == "discardpartial") return defs::DISCARD_PARTIAL_FRAMES; throw sls::RuntimeError("Unknown frame discard policy " + s); } template <> defs::fileFormat StringTo(const std::string &s) { if (s == "hdf5") return defs::HDF5; if (s == "binary") return defs::BINARY; throw sls::RuntimeError("Unknown file format " + s); } template <> defs::externalSignalFlag StringTo(const std::string &s) { if (s == "trigger_in_rising_edge") return defs::TRIGGER_IN_RISING_EDGE; if (s == "trigger_in_falling_edge") return defs::TRIGGER_IN_FALLING_EDGE; if (s == "inversion_on") return defs::INVERSION_ON; if (s == "inversion_off") return defs::INVERSION_OFF; throw sls::RuntimeError("Unknown external signal flag " + s); } template <> defs::readoutMode StringTo(const std::string &s) { if (s == "analog") return defs::ANALOG_ONLY; if (s == "digital") return defs::DIGITAL_ONLY; if (s == "analog_digital") return defs::ANALOG_AND_DIGITAL; throw sls::RuntimeError("Unknown readout mode " + s); } template <> defs::frameModeType StringTo(const std::string &s) { if (s == "pedestal") return defs::PEDESTAL; if (s == "newpedestal") return defs::NEW_PEDESTAL; if (s == "flatfield") return defs::FLATFIELD; if (s == "newflatfield") return defs::NEW_FLATFIELD; throw sls::RuntimeError("Unknown frame mode " + s); } template <> defs::detectorModeType StringTo(const std::string &s) { if (s == "counting") return defs::COUNTING; if (s == "interpolating") return defs::INTERPOLATING; if (s == "analog") return defs::ANALOG; throw sls::RuntimeError("Unknown detector mode " + s); } template <> defs::dacIndex StringTo(const std::string &s) { if (s == "dac 0") return defs::DAC_0; if (s == "dac 1") return defs::DAC_1; if (s == "dac 2") return defs::DAC_2; if (s == "dac 3") return defs::DAC_3; if (s == "dac 4") return defs::DAC_4; if (s == "dac 5") return defs::DAC_5; if (s == "dac 6") return defs::DAC_6; if (s == "dac 7") return defs::DAC_7; if (s == "dac 8") return defs::DAC_8; if (s == "dac 9") return defs::DAC_9; if (s == "dac 10") return defs::DAC_10; if (s == "dac 11") return defs::DAC_11; if (s == "dac 12") return defs::DAC_12; if (s == "dac 13") return defs::DAC_13; if (s == "dac 14") return defs::DAC_14; if (s == "dac 15") return defs::DAC_15; if (s == "dac 16") return defs::DAC_16; if (s == "dac 17") return defs::DAC_17; if (s == "vsvp") return defs::VSVP; if (s == "vtrim") return defs::VTRIM; if (s == "vrpreamp") return defs::VRPREAMP; if (s == "vrshaper") return defs::VRSHAPER; if (s == "vsvn") return defs::VSVN; if (s == "vtgstv") return defs::VTGSTV; if (s == "vcmp_ll") return defs::VCMP_LL; if (s == "vcmp_lr") return defs::VCMP_LR; if (s == "vcal") return defs::VCAL; if (s == "vcmp_rl") return defs::VCMP_RL; if (s == "rxb_rb") return defs::RXB_RB; if (s == "rxb_lb") return defs::RXB_LB; if (s == "vcmp_rr") return defs::VCMP_RR; if (s == "vcp") return defs::VCP; if (s == "vcn") return defs::VCN; if (s == "vishaper") return defs::VISHAPER; if (s == "vthreshold") return defs::VTHRESHOLD; if (s == "vref_ds") return defs::VREF_DS; if (s == "vcascn_pb") return defs::VCASCN_PB; if (s == "vcascp_pb") return defs::VCASCP_PB; if (s == "vout_cm") return defs::VOUT_CM; if (s == "vcasc_out") return defs::VCASC_OUT; if (s == "vin_cm") return defs::VIN_CM; if (s == "vref_comp") return defs::VREF_COMP; if (s == "ib_test_c") return defs::IB_TESTC; if (s == "vb_comp") return defs::VB_COMP; if (s == "vdd_prot") return defs::VDD_PROT; if (s == "vin_com") return defs::VIN_COM; if (s == "vref_prech") return defs::VREF_PRECH; if (s == "vb_pixbuf") return defs::VB_PIXBUF; if (s == "vb_ds") return defs::VB_DS; if (s == "vref_h_adc") return defs::VREF_H_ADC; if (s == "vb_comp_fe") return defs::VB_COMP_FE; if (s == "vb_comp_adc") return defs::VB_COMP_ADC; if (s == "vcom_cds") return defs::VCOM_CDS; if (s == "vref_rstore") return defs::VREF_RSTORE; if (s == "vb_opa_1st") return defs::VB_OPA_1ST; if (s == "vref_comp_fe") return defs::VREF_COMP_FE; if (s == "vcom_adc1") return defs::VCOM_ADC1; if (s == "vref_l_adc") return defs::VREF_L_ADC; if (s == "vref_cds") return defs::VREF_CDS; if (s == "vb_cs") return defs::VB_CS; if (s == "vb_opa_fd") return defs::VB_OPA_FD; if (s == "vcom_adc2") return defs::VCOM_ADC2; if (s == "vcassh") return defs::VCASSH; if (s == "vth2") return defs::VTH2; if (s == "vrshaper_n") return defs::VRSHAPER_N; if (s == "vipre_out") return defs::VIPRE_OUT; if (s == "vth3") return defs::VTH3; if (s == "vth1") return defs::VTH1; if (s == "vicin") return defs::VICIN; if (s == "vcas") return defs::VCAS; if (s == "vcal_n") return defs::VCAL_N; if (s == "vipre") return defs::VIPRE; if (s == "vcal_p") return defs::VCAL_P; if (s == "vdcsh") return defs::VDCSH; if (s == "vbp_colbuf") return defs::VBP_COLBUF; if (s == "vb_sda") return defs::VB_SDA; if (s == "vcasc_sfp") return defs::VCASC_SFP; if (s == "vipre_cds") return defs::VIPRE_CDS; if (s == "ibias_sfp") return defs::IBIAS_SFP; if (s == "trimbit_scan") return defs::TRIMBIT_SCAN; if (s == "highvoltage") return defs::HIGH_VOLTAGE; if (s == "iodelay") return defs::IO_DELAY; throw sls::RuntimeError("Unknown dac Index " + s); } template <> defs::burstMode StringTo(const std::string &s) { if (s == "off") return defs::BURST_OFF; if (s == "internal") return defs::BURST_INTERNAL; if (s == "external") return defs::BURST_EXTERNAL; throw sls::RuntimeError("Unknown burst mode " + s); } template <> defs::timingSourceType StringTo(const std::string &s) { if (s == "internal") return defs::TIMING_INTERNAL; if (s == "external") return defs::TIMING_EXTERNAL; throw sls::RuntimeError("Unknown timing source type " + s); } template <> uint32_t StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stoul(s, nullptr, base); } template <> uint64_t StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stoull(s, nullptr, base); } template <> int StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stoi(s, nullptr, base); } template <> bool StringTo(const std::string &s) { int i = std::stoi(s, nullptr, 10); switch (i) { case 0: return false; case 1: return true; default: throw sls::RuntimeError("Unknown boolean. Expecting be 0 or 1."); } } template <> int64_t StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stol(s, nullptr, base); } } // namespace sls