/******************************************************************************* * Gen.cpp Signal Generator classes * T.Barnaby, BEAM Ltd, 2006-09-12 ******************************************************************************* */ #include <Gen.h> #include <BArray.h> #include <TmsLib.h> #include <math.h> #define AVG_PRINT 0 const double pllFrequency = 125e6; // The PLL frequency const int defaultFrefGain = 4096; // The default PLL FREF gain const int defaultPllGain = 9; // The default PLL feedback gain (In shifts to the right) using namespace Tms; BString PNameValueList::getValue(BString name){ BString* s; if(s = find(name)){ return *s; } return ""; } void PNameValueList::setValue(BString name, BString value){ BString* s; if(s = find(name)){ *s = value; return; } else { append(PNameValue(name, value)); // BList<GenParam>::append(GenParam(name, value)); } } Gen::Gen(){ osampleRate = 125000000.0; ofref = 437000.0; ophaseTableFile = 0; ouseMsbFref = 0; opllInitialFrequencyDelay = 0; ophaseDelay = 0; ophaseDelayAll = -1; } Gen::~Gen(){ } BError Gen::init(PNameValueList& params){ BError err; BString s; oparams = params; if((s = params.getValue("fileName")) != "") ofileName = s; if((s = params.getValue("sampleRate")) != "") osampleRate = atof(s); if((s = params.getValue("fref")) != "") ofref = atof(s); if((s = params.getValue("phaseTableFile")) != "") ophaseTableFile = 1; if((s = params.getValue("useMsbFref")) != "") ouseMsbFref = atoi(s); if((s = params.getValue("pllInitialFrequencyDelay")) != "") opllInitialFrequencyDelay = atoi(s); if((s = params.getValue("phaseDelay")) != "") ophaseDelay = atoi(s); if((s = params.getValue("phaseDelayAll")) != "") ophaseDelayAll = atoi(s); if((s = params.getValue("name")) != "") oname = s; if((s = params.getValue("info")) != "") ocycleParam.info = s + " "; return ofile.open(ofileName, "w"); } BList<BString> Gen::getTypes(){ BList<BString> sl; sl.append("Beam1: Beam with 4 particle bunches at harmonic 8."); sl.append("Beam2: Beam with 4 particle bunches at harmonic 8. Beam then moves to 4 particle bunches at harmonic 16."); sl.append("Beam3: Beam with 4 particle bunches at harmonic 8. Beam then moves to 8 particle bunches at harmonic 16."); sl.append("Test1: Beam with 4 particle bunches at harmonic 8. Beam then moves to 8 particle bunches at harmonic 16."); return sl; } BError Gen::generate(BString cycleType){ BError err; if(cycleType == "Beam1") err = genBeam1(); else if(cycleType == "Beam2") err = genBeam2(); else if(cycleType == "Beam3") err = genBeam3(); else if(cycleType == "Test1") err = genTest1(); else err.set(1, "Unknown cycle type"); if(!err && ophaseTableFile){ BFile f; unsigned int s; unsigned int n; TmsPhase p; for(s = 0; s < ocycleParam.stateTable.size(); s++){ f.open(BString("phaseTable") + s + ".txt", "w"); for(n = 0; n < ocycleParam.stateTable[s].phaseTable.size(); n++){ p.value = ocycleParam.stateTable[s].phaseTable[n]; f.printf("%d ", p.lo1); f.printf("%d ", p.lo2); f.printf("%d ", p.gate); f.printf("%d ", p.blr); f.printf("%d ", p.meanFilter1); f.printf("%d\n", p.meanFilter2); } f.close(); } } return err; } void Gen::setPhaseDelay(){ BUInt32 n; ocycleParam.getdefaultPickupPositions(ocycleParam.frefPhaseDelay); if(ophaseDelayAll >= 0){ for(n = 0; n < ocycleParam.frefPhaseDelay.size(); n++){ ocycleParam.frefPhaseDelay[n] = ophaseDelayAll; } } else { for(n = 0; n < ocycleParam.frefPhaseDelay.size(); n++){ ocycleParam.frefPhaseDelay[n] += ophaseDelay; } } } BError Gen::genBeam1(){ BError err; CycleParamState st; BList<CycleParamState> cpl; // Set up base parameters ocycleParam.cycleType = oname; ocycleParam.info += "Beam with 4 particle bunches at harmonic 8."; ocycleParam.channel = 0; ocycleParam.pllInitialFrequency = int(pow(2.0, 32) / (pllFrequency / ofref)); ocycleParam.pllInitialFrequencyDelay = opllInitialFrequencyDelay; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions setPhaseDelay(); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); if(err = ocycleParam.setStates(cpl)) return err; ofile.writeString(ocycleParam.getString()); ofile.close(); return err; } BError Gen::genBeam2(){ BError err; CycleParamState st; BList<CycleParamState> cpl; // Set up base parameters ocycleParam.cycleType = oname; ocycleParam.info += "Beam with 4 particle bunches at harmonic 8. Beam then moves to 4 particle bunches at harmonic 16."; ocycleParam.channel = 0; ocycleParam.pllInitialFrequency = int(pow(2.0, 32) / (pllFrequency / ofref)); ocycleParam.pllInitialFrequencyDelay = opllInitialFrequencyDelay; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions setPhaseDelay(); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 16; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); if(err = ocycleParam.setStates(cpl)) return err; ofile.writeString(ocycleParam.getString()); ofile.close(); return err; } BError Gen::genBeam3(){ BError err; CycleParamState st; BList<CycleParamState> cpl; // Set up base parameters ocycleParam.cycleType = oname; ocycleParam.info += "Beam with 4 particle bunches at harmonic 8. Beam then moves to 4 particle bunches at harmonic 16."; ocycleParam.channel = 0; ocycleParam.pllInitialFrequency = int(pow(2.0, 32) / (pllFrequency / ofref)); ocycleParam.pllInitialFrequencyDelay = opllInitialFrequencyDelay; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions setPhaseDelay(); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 16; st.loPhase = 0.0; st.bunchMask = 0x03C0; st.mean1Mask = 0x03C0; st.mean2Mask = 0x0200; st.blrPhase = 0.85; cpl.append(st); if(err = ocycleParam.setStates(cpl)) return err; ofile.writeString(ocycleParam.getString()); ofile.close(); return err; } BError Gen::genTest1(){ BError err; CycleParamState st; BList<CycleParamState> cpl; // Set up base parameters ocycleParam.cycleType = oname; ocycleParam.info += "Beam with 4 particle bunches at harmonic 8. Beam then moves to 4 particle bunches at harmonic 16."; ocycleParam.channel = 0; ocycleParam.pllInitialFrequency = int(pow(2.0, 32) / (pllFrequency / ofref)); ocycleParam.pllInitialFrequencyDelay = opllInitialFrequencyDelay; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions setPhaseDelay(); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x20; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 16; st.loPhase = 0.0; st.bunchMask = 0x03C0; st.mean1Mask = 0x03C0; st.mean2Mask = 0x0200; st.blrPhase = 0.85; cpl.append(st); if(err = ocycleParam.setStates(cpl)) return err; ofile.writeString(ocycleParam.getString()); ofile.close(); return err; }