/*******************************************************************************
* TmsControl.cpp TMS API Command line Control application
* T.Barnaby, BEAM Ltd, 2007-02-12
*******************************************************************************
*
* This application provides a command line interface to the TMS system.
*/
#include <iostream>
#include <errno.h>
#include <stdio.h>
#include <getopt.h>
#include <TmsD.h>
#include <TmsC.h>
#include <TmsS.h>
#include <TmsLib.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;
BIter i;
UInt32 c;
UInt32 m;
UInt32 pn;
UInt32 pc;
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());
}
// 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());
}
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(TmsProcess& tmsProcess, BString fileName){
BError err;
TmsCycleParams cycleParamFile(".");
CycleParam params;
if(err = cycleParamFile.getCycleParams(fileName, params))
return err;
if(err = tmsProcess.setControlInfo(params)){
return err.set(1, BString("Error: Setting Control Info: ") + err.getString());
}
return err;
}
BError tmsDelControl(TmsProcess& tmsProcess, 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 = tmsProcess.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,%u", &channel, &pupeConfig.internalAdcClock, &pupeConfig.internalTiming);
if(n != 3){
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){
#ifdef ZAP
if (kst) {
file.printf("fref sigma lo1 lo2 gate blr mean1 mean2 dds_freq rfSelect1 rfSelect2 selFilter ");
file.printf("top[7] top[6] top[5] top[4] top[3] top[2] top[1] top[0]\n");
}
for(i = 0; i < data.size(); i++){
file.printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
getBitValue(data[i], 52, 1, 0), // FREF
getBitValue(data[i], 32, 14, 1), // Sigma
getBitValue(data[i], 48, 1, 0), // LO1
getBitValue(data[i], 49, 1, 0), // LO2
getBitValue(data[i], 47, 1, 0), // Gate
getBitValue(data[i], 46, 1, 0), // Blr
getBitValue(data[i], 50, 1, 0), // Mean1
getBitValue(data[i], 51, 1, 0), // Mean2
getBitValue(data[i], 0, 32, 1), // DDS_FREQ
getBitValue(data[i], 53, 1, 0), // RfSelect1
getBitValue(data[i], 54, 1, 0), // RfSelect2
getBitValue(data[i], 55, 1, 0), // SelFilter
getBitValue(data[i], 63, 1, 0), //
getBitValue(data[i], 62, 1, 0), //
getBitValue(data[i], 61, 1, 0), //
getBitValue(data[i], 60, 1, 0), //
getBitValue(data[i], 59, 1, 0), //
getBitValue(data[i], 58, 1, 0), //
getBitValue(data[i], 57, 1, 0), //
getBitValue(data[i], 56, 1, 0) //
);
}
#else
if (kst) {
file.printf("fref PllMsb PhaseTableMsb sigma lo1 lo2 gate blr mean1 mean2 dds_freq rfSelect1 rfSelect2 selFilter ");
file.printf("FRef HChange Injection CalStop CalStart CycleStop CycleStart SysClock\n");
}
for(i = 0; i < data.size(); i++){
file.printf("%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], 52, 1, 0), // FREF
getBitValue(data[i], 61, 1, 0), // PllMsb (FRef Reference)
getBitValue(data[i], 60, 1, 0), // PhaseTableMsb (Local FREF)
getBitValue(data[i], 32, 14, 1), // Sigma
getBitValue(data[i], 48, 1, 0), // LO1
getBitValue(data[i], 49, 1, 0), // LO2
getBitValue(data[i], 47, 1, 0), // Gate
getBitValue(data[i], 46, 1, 0), // Blr
getBitValue(data[i], 50, 1, 0), // Mean1
getBitValue(data[i], 51, 1, 0), // Mean2
getBitValue(data[i], 0, 32, 1), // DDS_FREQ
getBitValue(data[i], 53, 1, 0), // RfSelect1
getBitValue(data[i], 54, 1, 0), // RfSelect2
getBitValue(data[i], 55, 1, 0), // SelFilter
getBitValue(data[i], 63, 1, 0), //
getBitValue(data[i], 62, 1, 0), //
getBitValue(data[i], 61, 1, 0), //
getBitValue(data[i], 60, 1, 0), //
getBitValue(data[i], 59, 1, 0), //
getBitValue(data[i], 58, 1, 0), //
getBitValue(data[i], 57, 1, 0), //
getBitValue(data[i], 56, 1, 0) //
);
}
#endif
}
else if(captureInfo.source == 1){
if (kst) {
file.printf("Fref LO_pulse1 MultOut1 Sigma LO_Pulse2 MultOut2 F_Error\n");
}
for(i = 0; i < data.size(); i++){
Int32 timing = 0;
if(captureInfo.triggerStore){
timing = getBitValue(data[i], 56, 8, 0);
}
file.printf("%d %d %d %d %d %d %d\n",
getBitValue(data[i], 62, 1, 0), // FREF
getBitValue(data[i], 63, 1, 0), // LO_pulse1
getBitValue(data[i], 48, 14, 1), // mult_out1
getBitValue(data[i], 38, 9, 1) << 5, // Sigma
getBitValue(data[i], 47, 1, 0), // LO_pulse2
getBitValue(data[i], 24, 14, 1), // mult_out2
getBitValue(data[i], 0, 24, 1) // f_error
);
}
}
#ifdef ZAP
else if(captureInfo.source == 2){
if (kst) {
file.printf("Res0 Res1\n");
}
for(i = 0; i < data.size(); i++){
Int32 timing = 0;
if(captureInfo.triggerStore){
timing = getBitValue(data[i], 56, 8, 0);
}
file.printf("%d %d\n",
getBitValue(data[i], 0, 32, 1), // Res0
getBitValue(data[i], 32, 32, 1) // Res1
);
}
}
#else
else if(captureInfo.source == 2){
if (kst) {
file.printf("LO_pulse1 Fref LO_Pulse2 Sigma Gate B0 Result0\n");
}
for(i = 0; i < data.size(); i++){
Int32 timing = 0;
if(captureInfo.triggerStore){
timing = getBitValue(data[i], 56, 8, 0);
}
file.printf("%d %d %d %d %d %d %d\n",
getBitValue(data[i], 63, 1, 0), // LO_pulse1
getBitValue(data[i], 62, 1, 0), // FREF
getBitValue(data[i], 61, 1, 0), // LO_pulse2
getBitValue(data[i], 56, 5, 1) << 9, // Sigma
getBitValue(data[i], 55, 1, 0), // Gate
getBitValue(data[i], 32, 23, 0), // B0
getBitValue(data[i], 0, 32, 1) // Result0
);
}
}
#endif
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], 56, 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), // BLR
getBitValue(data[i], 63, 1, 0), // GATE
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 tmsReadData(TmsProcess& tmsProcess, BString readDataSpec, BString outFile){
BError err;
DataInfo dataInfo;
Data data;
UInt32 cn = 0;
BString ct;
BFile file;
UInt32 i;
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;
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());
}
printf("GotData: Err: %d Num: %d\n", err.getErrorNo(), data.numValues);
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){
BError err;
UInt32 i;
UInt32 num = 10;
UInt32 numValues = 1024 * 1024;
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 = numValues;
#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(numValues) * num * sizeof(DataValue)) / (t2 - t1);
printf("DataSize: %d DataRate: %f MBytes/sec\n", numValues, 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.getName())){
printf("Still Trying to reconnect\n");
sleep(1);
}
}
else {
return err;
}
}
}
t2 = getTime();
r = (double(numValues) * num * sizeof(DataValue)) / (t2 - t1);
printf("DataSize: %d DataRate: %f MBytes/sec\n", numValues, r / (1024 * 1024));
}
#endif
return err;
}
BError tmsPerfPu(TmsControl& tmsControl, TmsProcess& tmsProcess, BString hostName, int channel){
BError err;
UInt32 i;
UInt32 num = 10;
UInt32 numValues = 1024 * 1024;
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 = numValues;
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(numValues) * num * sizeof(DataValue)) / (t2 - t1);
printf("DataSize: %d DataRate: %f MBytes/sec\n", numValues, 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 << " --readData <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 << "\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,iAdcClk,iTiming> - Set the PUPE test configuration for the given channel\n";
cerr << " iAdcClk: Uses the internal ADC 125MHz clock rather than one synchronised to the external 10MHz Clock\n",
cerr << " iTiming: Uses internal hardware/software timing rather than the external timing signals\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 },
{ "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 },
{ "readData", 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;
while((c = getopt_long_only(argc, argv, "", options, &optIndex)) == 0){
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 == "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 == "readData"){
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++];
// 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(tmsProcess, setControlFileName)){
cerr << err.getString() + "\n";
return 1;
}
}
if(delControl != ""){
// Delete FPGA parameters
if(err = tmsDelControl(tmsProcess, 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;
// 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("%u %s\n", cn, ct.retStr());
}
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 = tmsProcess.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 = tmsReadData(tmsProcess, readDataSpec, outFile)){
cerr << err.getString() + "\n";
return 1;
}
}
if(perfPu){
// Performance Test
if(err = tmsPerfPu(tmsControl, tmsProcess, hostName, channel)){
cerr << err.getString() + "\n";
return 1;
}
}
if(perf){
// Performance Test
if(err = tmsPerf(tmsProcess, channel)){
cerr << err.getString() + "\n";
return 1;
}
}
return 0;
}