/******************************************************************************* * Gen.cpp Signal Generator classes * T.Barnaby, BEAM Ltd, 2006-09-12 ******************************************************************************* */ #include #include #include #include #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::append(GenParam(name, value)); } } Gen::Gen(){ osampleRate = 125000000.0; ofref = 437000.0; ophaseTableFile = 0; ouseMsbFref = 0; opllInitialFrequencyDelay = 0; } 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("name")) != "") oname = s; return ofile.open(ofileName, "w"); } BList Gen::getTypes(){ BList 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[3].phaseTable.size(); n++){ p.value = ocycleParam.stateTable[3].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; } BError Gen::genBeam1(){ BError err; CycleParamState st; BList 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 = 0; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions ocycleParam.getdefaultPickupPositions(ocycleParam.frefPhaseDelay); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; 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 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 = 0; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions ocycleParam.getdefaultPickupPositions(ocycleParam.frefPhaseDelay); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 16; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; 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 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 = 0; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions ocycleParam.getdefaultPickupPositions(ocycleParam.frefPhaseDelay); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 16; st.loPhase = 0.0; st.bunchMask = 0x03C0; st.mean1Mask = 0x03C0; st.mean2Mask = 0x0040; 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 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 = 0; ocycleParam.pllFrefGain = defaultFrefGain; ocycleParam.pllGain = defaultPllGain; ocycleParam.pllDdsMinimum = 0; ocycleParam.pllDdsMaximum = 0; // Set up Positions ocycleParam.getdefaultPickupPositions(ocycleParam.frefPhaseDelay); // Set up States ocycleParam.getDefaultState(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 8; st.loPhase = 0.0; st.bunchMask = 0x3C; st.mean1Mask = 0x3C; st.mean2Mask = 0x04; st.blrPhase = 0.85; cpl.append(st); st.loHarmonic = 16; st.loPhase = 0.0; st.bunchMask = 0x03C0; st.mean1Mask = 0x03C0; st.mean2Mask = 0x0040; st.blrPhase = 0.85; cpl.append(st); if(err = ocycleParam.setStates(cpl)) return err; ofile.writeString(ocycleParam.getString()); ofile.close(); return err; }