/******************************************************************************* * TmsControl.cpp TMS API Command line Control application * T.Barnaby, BEAM Ltd, 2007-02-12 * updated by D.Korchagin, CERN AB-BI-SW, 2007-08-31 ******************************************************************************* * * This application provides a command line interface to the TMS system. */ #include <iostream> #include <errno.h> #include <stdio.h> #include <unistd.h> #ifndef __Lynx__ #include <getopt.h> #else struct option { #if defined (__STDC__) && __STDC__ const char *name; #else char *name; #endif int has_arg; int *flag; int val; }; #endif #include <TmsD.h> #include <TmsC.h> #include <TmsS.h> #include <TmsLib.h> #include <TmsCycleParam.h> #include <BEntry.h> #include <BFile.h> #include <sys/time.h> using namespace Tms; using namespace std; const UInt32 tmsStateNum = 16; const UInt32 tmsPickupNum = 40; const UInt32 tmsMaxNumPickups = 100; int kst = 0; double getTime() { struct timeval tp; gettimeofday(&tp, NULL); return ((double) tp.tv_sec + (double) tp.tv_usec * 1e-6); } class TmsEventServer : public Tms::TmsEventService { public: TmsEventServer(BoapServer& server, BString name) : Tms::TmsEventService(server, name){} BError errorEvent(UInt32 cycleNumber, BError error){ BError err; printf("Event: Error: Cycle: %d Error: %d:%s\n", cycleNumber, error.getErrorNo(), error.getString().retStr()); return err; } BError cycleStartEvent(UInt32 cycleNumber){ BError err; printf("Event: CycleStartEvent: %d\n", cycleNumber); return err; } BError cycleStopEvent(UInt32 cycleNumber){ BError err; printf("Event: CycleStopEvent: %d\n",cycleNumber ); return err; } BError dataEvent(DataInfo dataInfo){ BError err; printf("Event: DataEvent: %d\n", dataInfo.numValues); return err; } }; // Initialise and test the TMS system BError tmsInit(TmsControl& tmsControl){ BError err; ConfigInfo configInfo; BList<BError> errorList; BList<NameValue> nvList; BString version; // Get Version if(err = tmsControl.getVersion(version)){ return err.set(1, BString("Error: getting version: ") + err.getString()); } cout << "Version: " << version << "\n"; // Initialise TMS system if(err = tmsControl.init()){ return err.set(1, BString("Error: initialising TMS: ") + err.getString()); } #ifdef ZAP UInt32 c; UInt32 m; UInt32 pn; UInt32 pc; // Configure TMS system configInfo.puReferences.resize(0); c = 1; for(m = 1; c <= tmsPickupNum; m++){ for(pn = 1; (c <= tmsPickupNum) && (pn < 6); pn++){ for(pc = 1; (c <= tmsPickupNum) && (pc < 4); pc++){ printf("Set: %d: %d,%d,%d\n", c, m, pn, pc); configInfo.puReferences.resize(c); configInfo.puReferences[c - 1] = PuChannel(m, pn, pc); c++; } } } if(err = tmsControl.configure(configInfo)){ return err.set(1, BString("Error: configuring TMS: ") + err.getString()); } #endif return err; } BError tmsConfigure(TmsControl& tmsControl, BString fileName){ BError err; ConfigInfo configInfo; BEntryFile file; unsigned int n; PuChannel chan; BString s; if(file.open(fileName)){ return err.set(1, BString("Unable to open file: ") + fileName); } if(file.read()){ return err.set(1, BString("Unable to read file: ") + fileName); } configInfo.puReferences.resize(0); for(n = 1; n <= tmsMaxNumPickups; n++){ s = file.findValue(BString("PickUp") + n + ":"); if(s != ""){ configInfo.puReferences.resize(n + 1); if(sscanf(s, "%hhd,%hhd,%hhd", &chan.moduleNum, &chan.pupeNum, &chan.pupeChan) != 3){ err.set(ErrorConfig, "Pick-Up channel error in configuration file"); return err; } configInfo.puReferences[n - 1] = chan; } else { break; } } if(err = tmsControl.configure(configInfo)){ return err.set(1, BString("Error: configuring TMS: ") + err.getString()); } return err; } BError tmsGetConfiguration(TmsControl& tmsControl){ BError err; ConfigInfo configInfo; unsigned int n; if(err = tmsControl.getConfiguration(configInfo)){ return err.set(1, BString("Error: getting configuration TMS: ") + err.getString()); } for(n = 0; n < configInfo.puReferences.size(); n++){ printf("%d\t%d,%d,%d\n", n + 1, configInfo.puReferences[n].moduleNum, configInfo.puReferences[n].pupeNum, configInfo.puReferences[n].pupeChan); } return err; } BError tmsSetControl(TmsControl& tmsControl, BString fileName){ BError err; CycleParamEdit params; if(err = params.readFromFile(fileName)) return err; if(err = tmsControl.setControlInfo(params)){ return err.set(1, BString("Error: Setting Control Info: ") + err.getString()); } return err; } BError tmsDelControl(TmsControl& tmsControl, BString delControl){ BError err; char cycleType[1024]; UInt32 channel; if(sscanf(delControl, "%[^,],%u", cycleType, &channel) != 2){ err.set(ErrorConfig, "Error in tmsDelControl spec"); return err; } if(err = tmsControl.delControlInfo(cycleType, channel)){ return err.set(1, BString("Error: Deleting Control Info: ") + err.getString()); } return err; } BError tmsSetTestData(TmsControl& tmsControl, BString testData){ BError err; BArray<UInt32> data; BFile file; UInt32 channel; PuChannel puChannel; char fileName[1024] = "\0"; int n; int nb; n = sscanf(testData, "%u,%s", &channel, fileName); if((n < 1) || (n > 2)){ err.set(ErrorConfig, "Error in setTestData spec"); return err; } // get Physical Channel number if(err = tmsControl.getPuChannel(channel, puChannel)){ return err.set(1, BString("Error: Getting Physical Channel Number: ") + err.getString()); } if(n == 2){ if(err = file.open(fileName, "r")){ return err.set(1, BString("Error: Opening file: ") + fileName); } data.resize(1024); if((nb = file.read(&data[0], 1024 * sizeof(UInt32))) <= 0){ return err.set(1, BString("Error: Reading 1024 32bit data items from file: ") + fileName); } data.resize(nb / sizeof(UInt32)); if(err = tmsControl.setTestData(puChannel, 1, data)){ return err.set(1, err.getString()); } } else { if(err = tmsControl.setTestData(puChannel, 0, data)){ return err.set(1, err.getString()); } } return err; } BError tmsSetPupeConfig(TmsControl& tmsControl, BString pupeConfigString){ BError err; UInt32 channel; PuChannel puChannel; PupeConfig pupeConfig; UInt32 n; n = sscanf(pupeConfigString, "%u,%u,%x,%u", &channel, &pupeConfig.adcSysclkSync, &pupeConfig.internalTimingMask, &pupeConfig.disableBlr); if(n != 4){ err.set(ErrorConfig, "Error in pupeConfigString spec"); return err; } // get Physical Channel number if(err = tmsControl.getPuChannel(channel, puChannel)){ return err.set(1, BString("Error: Getting Physical Channel Number: ") + err.getString()); } if(err = tmsControl.setPupeConfig(puChannel, pupeConfig)){ return err.set(1, err.getString()); } return err; } Int32 getBitValue(UInt64 value, int startBit, int nBits, int s){ Int64 v; UInt64 bm = (1ULL << nBits) - 1; UInt64 sm = (1ULL << (nBits - 1)); v = (value >> startBit) & bm; if(s){ v = -(v & sm) | v; } return v; } #define BIT(v,b) ((v >> b) & 1) BError tmsCaptureDiagnostics(TmsControl& tmsControl, TmsProcess& tmsProcess, BString captureSpec, BString outFile){ BError err; TestCaptureInfo captureInfo; BArray<UInt64> data; UInt32 cn = 0; BString ct; BFile file; UInt32 i; UInt32 channel; PuChannel puChannel; if(sscanf(captureSpec, "%u,%u,%u, %u,%u,%u,%u,%u,%u", &channel, &captureInfo.source, &captureInfo.clock, &captureInfo.startTime, &captureInfo.postTriggerDelay, &captureInfo.triggerAnd, &captureInfo.triggerStore, &captureInfo.triggerSourceData, &captureInfo.triggerMask) != 9){ err.set(ErrorConfig, "Error in CapSpec"); return err; } if(outFile == "") outFile = "data.txt"; if(err = file.open(outFile, "w")){ return err.set(1, BString("Error: Opening file: ") + outFile); } // get Physical Channel number if(err = tmsControl.getPuChannel(channel, puChannel)){ return err.set(1, BString("Error: Getting Physical Channel Number: ") + err.getString()); } // Get next Cycle Number if(err = tmsProcess.getCycleInfo(cn, ct)){ return err.set(1, BString("Error: Getting Cycle Number: ") + err.getString()); } printf("CaptureTestData: Channel: %u:%u:%u CycleNumber: %u CycleType: %s\n", puChannel.moduleNum, puChannel.pupeNum, puChannel.pupeChan, cn, ct.retStr()); if(err = tmsControl.captureTestData(puChannel, captureInfo, data)){ return err.set(1, BString("Error: Getting Data: ") + err.getString()); } // Assumes source == 0 if(captureInfo.source == 0){ if (kst) { if(captureInfo.triggerStore){ file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 Gate Blr Mean1 Mean2 RfSelect1 RfSelect2 SelFilter SwitchState DdsFreq "); file.printf("FRef HChange Injection CalStop CalStart CycleStop CycleStart SysClock\n"); } else { file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 Gate Blr Mean1 Mean2 RfSelect1 RfSelect2 SelFilter SwitchState DdsFreq\n"); } } for(i = 0; i < data.size(); i++){ if(captureInfo.triggerStore){ file.printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", getBitValue(data[i], 63, 1, 0), // FREF !getBitValue(data[i], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(data[i], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(data[i], 60, 1, 0), // LO1 // getBitValue(data[i], 57, 3, 1), // Sigma (3 bits) getBitValue(data[i], 32, 12, 1), // Sigma (12 bits) getBitValue(data[i], 56, 1, 0), // LO2 getBitValue(data[i], 49, 1, 0), // Gate getBitValue(data[i], 48, 1, 0), // Blr getBitValue(data[i], 50, 1, 0), // Mean1 getBitValue(data[i], 51, 1, 0), // Mean2 getBitValue(data[i], 52, 1, 0), // RfSelect1 getBitValue(data[i], 53, 1, 0), // RfSelect2 getBitValue(data[i], 54, 1, 0), // SelFilter getBitValue(data[i], 44, 4, 0), // SwitchState getBitValue(data[i], 8, 24, 1), // DDS_FREQ getBitValue(data[i], 7, 1, 0), // FREF getBitValue(data[i], 6, 1, 0), // HCHANGE event getBitValue(data[i], 5, 1, 0), // INJECTION event getBitValue(data[i], 4, 1, 0), // CAL_STOP event getBitValue(data[i], 3, 1, 0), // CAL_START event getBitValue(data[i], 2, 1, 0), // CYCLE_STOP event getBitValue(data[i], 1, 1, 0), // CYCLE_START event getBitValue(data[i], 0, 1, 0) // 10MHz System Clock ); } else { file.printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", getBitValue(data[i], 63, 1, 0), // FREF !getBitValue(data[i], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(data[i], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(data[i], 60, 1, 0), // LO1 // getBitValue(data[i], 57, 3, 1), // Sigma (3 bits) getBitValue(data[i], 32, 12, 1), // Sigma (12 bits) getBitValue(data[i], 56, 1, 0), // LO2 getBitValue(data[i], 49, 1, 0), // Gate getBitValue(data[i], 48, 1, 0), // Blr getBitValue(data[i], 50, 1, 0), // Mean1 getBitValue(data[i], 51, 1, 0), // Mean2 getBitValue(data[i], 52, 1, 0), // RfSelect1 getBitValue(data[i], 53, 1, 0), // RfSelect2 getBitValue(data[i], 54, 1, 0), // SelFilter getBitValue(data[i], 44, 4, 0), // SwitchState getBitValue(data[i], 0, 32, 1) // DDS_FREQ ); } } } else if(captureInfo.source == 1){ if (kst) { file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 MultOut1 MultOut2 F_Error\n"); } for(i = 0; i < data.size(); i++){ Int32 timing = 0; if(captureInfo.triggerStore){ timing = getBitValue(data[i], 0, 8, 0); } file.printf("%d %d %d %d %d %d %d %d %d\n", getBitValue(data[i], 63, 1, 0), // FREF !getBitValue(data[i], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(data[i], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(data[i], 60, 1, 0), // LO1 getBitValue(data[i], 57, 3, 1), // Sigma (3 bits) getBitValue(data[i], 56, 1, 0), // LO2 getBitValue(data[i], 38, 14, 1), // mult_out1 getBitValue(data[i], 24, 14, 1), // mult_out2 getBitValue(data[i], 0, 24, 1) // f_error ); } } else if(captureInfo.source == 2){ if (kst) { file.printf("FrefIn PllMsb PhaseTableMsb Lo1 Sigma Lo2 Gate B0 Result0\n"); } for(i = 0; i < data.size(); i++){ Int32 timing = 0; if(captureInfo.triggerStore){ timing = getBitValue(data[i], 0, 8, 0); } file.printf("%d %d %d %d %d %d %d %d %d\n", getBitValue(data[i], 63, 1, 0), // FREF !getBitValue(data[i], 62, 1, 0), // PllMsb (FRef Reference) !getBitValue(data[i], 61, 1, 0), // PhaseTableMsb (Local FREF) getBitValue(data[i], 60, 1, 0), // LO1 getBitValue(data[i], 57, 3, 1), // Sigma (3 bits) getBitValue(data[i], 56, 1, 0), // LO2 getBitValue(data[i], 55, 1, 0), // Gate getBitValue(data[i], 32, 23, 1), // B0 getBitValue(data[i], 0, 32, 1) // Result0 ); } } else if(captureInfo.source == 3){ if (kst) { file.printf("Sigma Gate Blr X0 E0 Y0\n"); } for(i = 0; i < data.size(); i++){ Int32 timing = 0; if(captureInfo.triggerStore){ timing = getBitValue(data[i], 0, 8, 0); } file.printf("%d %d %d %d %d %d %d\n", getBitValue(data[i], 48, 14, 1), // Sigma getBitValue(data[i], 62, 1, 0), // Gate getBitValue(data[i], 63, 1, 0), // Blr getBitValue(data[i], 0, 16, 1), // X0 getBitValue(data[i], 16, 16, 1), // E0 getBitValue(data[i], 32, 16, 1) // Y0 ); } } else { err.set(1, BString("Source: ") + captureInfo.source + " not supported"); } file.close(); return err; } BError tmsGetData(TmsProcess& tmsProcess, BString readDataSpec, BString outFile){ BError err; DataInfo dataInfo; Data data; UInt32 cn = 0; BString ct; BFile file; UInt32 i; UInt32 t = 0; if(sscanf(readDataSpec, "%u,%u,%u,%u,%u,%u,%u", &dataInfo.channel, &dataInfo.cyclePeriod, &dataInfo.startTime, &dataInfo.orbitNumber, &dataInfo.bunchNumber, &dataInfo.numValues, &dataInfo.function) != 7){ err.set(ErrorConfig, "Error in DataSpec"); return err; } if(outFile == "") outFile = "data.txt"; if(err = file.open(outFile, "w")){ return err.set(1, BString("Error: Opening file: ") + outFile); } // Set data require and wait for data if(err = tmsProcess.getCycleInfo(cn, ct)){ return err.set(1, BString("Error: Getting Cycle Number: ") + err.getString()); } dataInfo.cycleNumber = cn; dataInfo.argument = 0; dataInfo.limitData = 1; printf("GetData: CycleNumber: %u CycleType: %s\n", cn, ct.retStr()); if(err = tmsProcess.getData(dataInfo, data)){ return err.set(1, BString("Error: Getting Data: ") + err.getString()); } if(data.dataValues.size()){ t = data.dataValues[0].timeMs; } printf("GotData: Num: %d NumBunches: %d NumChannels: %d FirstTime: %dms\n", data.numValues, data.numBunches, data.numChannels, t); if (kst) { file.printf("sigma deltaX deltaY\n"); } for(i = 0; i < data.numValues; i++){ file.printf("%d %d %d\n", data.dataValues[i].sigma, data.dataValues[i].deltaX, data.dataValues[i].deltaY); } file.close(); return err; } BError tmsPerf(TmsProcess& tmsProcess, int channel, int numSamples){ BError err; UInt32 i; UInt32 num = 10; DataInfo dataInfo; Data data; double t1, t2, r; BString ct; // Set data require and wait for data dataInfo.cycleNumber = 0; dataInfo.channel = channel; dataInfo.cyclePeriod = CyclePeriodHarmonic0; dataInfo.startTime = 0; dataInfo.orbitNumber = 0; dataInfo.bunchNumber = 0; dataInfo.function = 0; dataInfo.argument = 0; dataInfo.numValues = numSamples; #ifdef ZAP tmsProcess.getCycleNumber(dataInfo.cycleNumber); dataInfo.cycleNumber--; t1 = getTime(); for(i = 0; i < num; i++){ if(err = tmsProcess.getData(dataInfo, data)){ return err.set(1, BString("Error: Getting Data: ") + err.getString()); } } t2 = getTime(); r = (double(numSamples) * num * sizeof(DataValue)) / (t2 - t1); printf("DataSize: %d DataRate: %f MBytes/sec\n", numSamples, r / (1024 * 1024)); #else while(1){ tmsProcess.getCycleInfo(dataInfo.cycleNumber, ct); dataInfo.cycleNumber--; t1 = getTime(); for(i = 0; i < num; i++){ while(err = tmsProcess.getData(dataInfo, data)){ if(err.getErrorNo() == -EPIPE){ printf("Try to reconnect\n"); tmsProcess.disconnectService(); while(err = tmsProcess.connectService(tmsProcess.getServiceName())){ printf("Still Trying to reconnect\n"); sleep(1); } } else { return err; } } } t2 = getTime(); r = (double(numSamples) * num * sizeof(DataValue)) / (t2 - t1); printf("DataSize: %d CallTime: %f s DataRate: %f MBytes/sec\n", numSamples, (t2 - t1) / num, r / (1024 * 1024)); } #endif return err; } BError tmsPerfPu(TmsControl& tmsControl, TmsProcess& tmsProcess, BString hostName, int channel, int numSamples){ BError err; UInt32 i; UInt32 num = 10; DataInfo dataInfo; Data data; double t1, t2, r; PuChannel chan; PuProcess puProcess; BString ct; tmsControl.getPuChannel(channel, chan); if(err = puProcess.connectService(BString("//") + hostName + "/puProcess-" + chan.moduleNum)) return err; // Set data require and wait for data dataInfo.cycleNumber = 0; dataInfo.channel = 1; dataInfo.cyclePeriod = CyclePeriodHarmonic0; dataInfo.startTime = 0; dataInfo.orbitNumber = 0; dataInfo.bunchNumber = 0; dataInfo.function = 0; dataInfo.argument = 0; dataInfo.numValues = numSamples; while(1){ tmsProcess.getCycleInfo(dataInfo.cycleNumber, ct); dataInfo.cycleNumber--; t1 = getTime(); for(i = 0; i < num; i++){ if(err = puProcess.getData(chan, dataInfo, data)){ return err.set(1, BString("Error: Getting Data: ") + err.getString()); } } t2 = getTime(); r = (double(numSamples) * num * sizeof(DataValue)) / (t2 - t1); printf("DataSize: %d DataRate: %f MBytes/sec\n", numSamples, r / (1024 * 1024)); } return err; } BError tmsEventsProcess(TmsProcess& tmsProcess, BString host){ BError err; static BoapServer boapServer; static TmsEventServer tmsEventServer(boapServer, ""); if(err = boapServer.init(host, BoapServer::THREADED)){ return err; } boapServer.run(1); if(err = tmsProcess.addEventServer(tmsEventServer.name())){ return err; } pause(); return err; } void usage(void) { cerr << "Usage:\ttmsControl [options] hostname\n"; cerr << " --help - Help on command line parameters\n"; cerr << " --debug 0x1122 - Set Debug mask\n"; cerr << " --version - Display Version numbers\n"; cerr << " --events - Show all events\n"; cerr << " --outFile <fileName> - Send output to given file. Default to data.txt\n"; cerr << " --kst - Format output file for kst plotting\n"; cerr << " --init - Initialise TMS system\n"; cerr << " --test - Test TMS system\n"; cerr << " --status - Get Status of TMS system\n"; cerr << " --statistics - Get Statistics from TMS system\n"; cerr << " --configure <file> - Configure taking channel information from the given file\n"; cerr << " --getConfiguration - Gets and displays the current configuration\n"; cerr << " --setControl <file>- Adds or modifies an entry in the TMS State/Phase table database from the given file\n"; cerr << " --delControl <Spec>- Deletes an entry from the TMS State/Phase table database\n"; cerr << " Spec: cycleType,Channel\n"; cerr << " --cycleType <type> - Sets the CycleType for the next cycle\n"; cerr << "\n"; cerr << " --getCycleInfo - Read information on current cycle\n"; cerr << " --getData <DataSpec> - Read data from the system using the DataSpec given\n"; cerr << " DataSpec: <chan,period,startTime,orbit,bunch,numSamples,function>\n"; cerr << "\n"; cerr << " --perfPu - Perform a getData performance test direct to the first PU\n"; cerr << " --perf - Perform a getData performance test\n"; cerr << " --channel <n> - Channel to use\n"; cerr << " --numSamples <n> - Number of 8byte samples to read\n"; cerr << "\n"; cerr << " --captureDiagnostics <CapSpec> - Capture Diagnostics data\n"; cerr << " CapSpec: <chan,source,clock,startTime,postTriggerDelay,trigAnd,trigStore,trigData,trigMask>\n"; cerr << " --setTestData <chan,filename> - Set the test input data for the given channel\n"; cerr << " --setPupeConfig <chan,adcClkSync,timingMask,disableBlr> - Set the PUPE test configuration for the given channel\n"; cerr << " iAdcClkRef: Uses the internal free running ADC 125MHz clock rather than one synchronised to the external 10MHz Clock\n", cerr << " iTimingMask: Hex bitmask. Uses internal hardware/software timing rather than the external timing signals for the given timing signals (eg CycleStop 0x04)\n", cerr << "\n"; } static struct option options[] = { { "?", 0, NULL, 0 }, { "h", 0, NULL, 0 }, { "help", 0, NULL, 0 }, { "debug", 1, NULL, 0 }, { "channel", 1, NULL, 0 }, { "numSamples", 1, NULL, 0 }, { "events", 0, NULL, 0 }, { "outFile", 1, NULL, 0 }, { "kst", 0, NULL, 0 }, { "version", 0, NULL, 0 }, { "init", 0, NULL, 0 }, { "test", 0, NULL, 0 }, { "status", 0, NULL, 0 }, { "statistics", 0, NULL, 0 }, { "configure", 1, NULL, 0 }, { "getConfiguration", 0, NULL, 0 }, { "setControl", 1, NULL, 0 }, { "delControl", 1, NULL, 0 }, { "getCycleInfo", 0, NULL, 0 }, { "getData", 1, NULL, 0 }, { "perf", 0, NULL, 0 }, { "perfPu", 0, NULL, 0 }, { "captureDiagnostics", 1, NULL, 0 }, { "cycleType", 1, NULL, 0 }, { "setTestData", 1, NULL, 0 }, { "setPupeConfig", 1, NULL, 0 }, { 0,0,0,0 } }; int main(int argc, char** argv){ BError err; TmsControl tmsControl("tmsControl"); TmsProcess tmsProcess("tmsProcess"); int c; int optIndex = 0; BString s; int debug = 0; int channel = 1; int version = 0; int test = 0; int status = 0; int statistics = 0; int perf = 0; int perfPu = 0; int init = 0; int events = 0; BString cycleType; int getCycleInfo = 0; BString readDataSpec; BString captureDiagnostics; BString configFileName; BString setControlFileName; BString delControl; BString hostName; BIter i; BString setTestData; int getConfiguration = 0; BString setPupeConfig; BString outFile; int numSamples = 1024 * 1024; #ifndef __Lynx__ while((c = getopt_long_only(argc, argv, "", options, &optIndex)) == 0){ #else char *optarg = NULL; int optind = argc; c = 0; cerr << "\n!!!WARNING:\ttmsControl is only compatible with Linux OS for the moment\n\n"; while(false){ #endif s = options[optIndex].name; if(s == "help" || s == "h" || s == "?"){ usage(); return 1; } else if(s == "debug"){ debug = strtol(optarg, 0, 0); } else if(s == "channel"){ channel = strtol(optarg, 0, 0); } else if(s == "numSamples"){ numSamples = strtol(optarg, 0, 0); } else if(s == "outFile"){ outFile = optarg; } else if(s == "init"){ init = 1; } else if(s == "version"){ version = 1; } else if(s == "kst"){ kst = 1; } else if(s == "test"){ test = 1; } else if(s == "status"){ status = 1; } else if(s == "statistics"){ statistics = 1; } else if(s == "configure"){ configFileName = optarg; } else if(s == "getConfiguration"){ getConfiguration = 1; } else if(s == "cycleType"){ cycleType = optarg; } else if(s == "setControl"){ setControlFileName = optarg; } else if(s == "delControl"){ delControl = optarg; } else if(s == "getData"){ readDataSpec = optarg; } else if(s == "getCycleInfo"){ getCycleInfo = 1; } else if(s == "events"){ events = 1; } else if(s == "perf"){ perf = 1; } else if(s == "perfPu"){ perfPu = 1; } else if(s == "captureDiagnostics"){ captureDiagnostics = optarg; } else if(s == "setTestData"){ setTestData = optarg; } else if(s == "setPupeConfig"){ setPupeConfig = optarg; } } if(optind == argc){ usage(); return 1; } hostName = argv[optind++]; // tmsProcess.setPriority(6); // Connect to TMS control objects if(err = tmsControl.connectService(BString("//") + hostName + "/tmsControl")){ cerr << "Error: cannot connect to tmsControl: " << err.getString() << "\n"; return 1; } if(err = tmsProcess.connectService(BString("//") + hostName + "/tmsProcess")){ cerr << "Error: cannot connect to tmsProcess: " << err.getString() << "\n"; return 1; } if(events){ if(err = tmsEventsProcess(tmsProcess, hostName)){ cerr << err.getString() + "\n"; return 1; } } if(version){ // Get Version if(err = tmsControl.getVersion(s)){ cerr << "Error: geting TmsControl Version: " << err.getString() << "\n"; return 1; } cout << "TmsControl Version: " << s << "\n"; if(err = tmsProcess.getVersion(s)){ cerr << "Error: geting TmsProcess Version: " << err.getString() << "\n"; return 1; } cout << "TmsProcess Version: " << s << "\n"; } if(init){ // Initialise TMS system if(err = tmsInit(tmsControl)){ cerr << "Error: initialising TMS: " << err.getString() + "\n"; return 1; } } if(test){ BList<BError> errorList; if(err = tmsControl.test(errorList)){ cerr << "Error: performing test: " << err.getString() + "\n"; return 1; } for(errorList.start(i); !errorList.isEnd(i); errorList.next(i)){ cout << errorList[i].getErrorNo() << ": " << errorList[i].getString() << "\n"; } } if(status){ BList<NameValue> statusList; if(err = tmsControl.getStatus(statusList)){ cerr << "Error: getting status: " << err.getString() + "\n"; return 1; } for(statusList.start(i); !statusList.isEnd(i); statusList.next(i)){ cout << statusList[i].name << ": " << statusList[i].value << "\n"; } } if(statistics){ BList<NameValue> statusList; if(err = tmsControl.getStatistics(statusList)){ cerr << "Error: getting statistics: " << err.getString() + "\n"; return 1; } for(statusList.start(i); !statusList.isEnd(i); statusList.next(i)){ cout << statusList[i].name << ": " << statusList[i].value << "\n"; } } if(configFileName != ""){ // Configure TMS system if(err = tmsConfigure(tmsControl, configFileName)){ cerr << err.getString() + "\n"; return 1; } } if(getConfiguration){ // Get Configuration if(err = tmsGetConfiguration(tmsControl)){ cerr << err.getString() + "\n"; return 1; } } if(setControlFileName != ""){ // Set FPGA parameters if(err = tmsSetControl(tmsControl, setControlFileName)){ cerr << err.getString() + "\n"; return 1; } } if(delControl != ""){ // Delete FPGA parameters if(err = tmsDelControl(tmsControl, delControl)){ cerr << err.getString() + "\n"; return 1; } } if(setTestData != ""){ if(err = tmsSetTestData(tmsControl, setTestData)){ err.set(1, BString("Error: Setting test data: ") + err.getString()); cerr << err.getString() + "\n"; return 1; } } if(setPupeConfig != ""){ if(err = tmsSetPupeConfig(tmsControl, setPupeConfig)){ err.set(1, BString("Error: Setting Pupe Config: ") + err.getString()); cerr << err.getString() + "\n"; return 1; } } if(getCycleInfo){ UInt32 cn; BString ct; CycleInformation info; BIter i; // Get current cycle info if(err = tmsProcess.getCycleInfo(cn, ct)){ err.set(1, BString("Error: Getting Cycle Number: ") + err.getString()); cerr << err.getString() + "\n"; return 1; } printf("CycleNumber: %u CycleType: %s\n", cn, ct.retStr()); if(err = tmsProcess.getCycleInformation(cn, info)){ err.set(1, BString("Error: Getting Cycle Information: ") + err.getString()); cerr << err.getString() + "\n"; return 1; } printf("CycleNumber: %u\n", info.cycleNumber); printf("CycleType: %s\n", info.cycleType.retStr()); for(info.periods.start(i); !info.periods.isEnd(i); info.periods.next(i)){ printf("CyclePeriod: %u StartTime: %u EndTime: %u NumBunches: %u NumValues: %u\n", info.periods[i].cyclePeriod, info.periods[i].startTime, info.periods[i].endTime, info.periods[i].numBunches, info.periods[i].numValues); } } if(cycleType != ""){ UInt32 cn; BString ct; // Get current cycle info if(err = tmsProcess.getCycleInfo(cn, ct)){ err.set(1, BString("Error: Getting Cycle Number: ") + err.getString()); cerr << err.getString() + "\n"; return 1; } // Set NextCycle type if(err = tmsControl.setNextCycle(cn + 1, cycleType)){ err.set(1, BString("Error: Setting Next Cycle: ") + err.getString()); cerr << err.getString() + "\n"; return 1; } } if(captureDiagnostics != ""){ // Capture Diagnostics Data from the TMS system if(err = tmsCaptureDiagnostics(tmsControl, tmsProcess, captureDiagnostics, outFile)){ cerr << err.getString() + "\n"; return 1; } } if(readDataSpec != ""){ // Read Data from the TMS system if(err = tmsGetData(tmsProcess, readDataSpec, outFile)){ cerr << err.getString() + "\n"; return 1; } } if(perfPu){ // Performance Test if(err = tmsPerfPu(tmsControl, tmsProcess, hostName, channel, numSamples)){ cerr << err.getString() + "\n"; return 1; } } if(perf){ // Performance Test if(err = tmsPerf(tmsProcess, channel, numSamples)){ cerr << err.getString() + "\n"; return 1; } } return 0; }