/******************************************************************************* * TmsControlClient2.cpp TMS API example code * T.Barnaby, BEAM Ltd, 2007-02-07 ******************************************************************************* * * This is a very basic example of using the TmsApi to set the * TMS's cycleNumber and cycleType. * It is designed to give an overview of using the API. */ #include <iostream> #include <stdio.h> #include <unistd.h> #include <sys/time.h> #include <TmsD.h> #include <TmsC.h> #include <TmsS.h> #include <BSema.h> using namespace Tms; using namespace std; #define DEBUG 0 #if DEBUG #define dprintf(fmt, a...) printf(fmt, ##a); #else #define dprintf(fmt, a...) #endif BSema cycleStopSemaphore; 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; dprintf("Event: Error: Cycle: %d Error: %d:%s\n", cycleNumber, error.getErrorNo(), error.getString().retStr()); return err; } BError cycleStartEvent(UInt32 cycleNumber){ BError err; dprintf("Event: CycleStartEvent: %d\n", cycleNumber); return err; } BError cycleStopEvent(UInt32 cycleNumber){ BError err; dprintf("Event: CycleStopEvent: %d\n",cycleNumber ); cycleStopSemaphore.post(); return err; } BError dataEvent(DataInfo dataInfo){ BError err; dprintf("Event: DataEvent: %d\n", dataInfo.numValues); 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; } return err; } // Loop sending next cycle information BError tmsControlLoop(TmsControl& tmsControl){ BError err; UInt32 cn = 0; BString ct; BString ct1 = "Beam3"; BString ct2 = "SigGenBeam3"; double t1, t2, tLast; double tStart; tStart = tLast = getTime(); while(1){ // Wait for next cycle information cycleStopSemaphore.wait(); // Set next cycle information cn = cn + 1; #ifndef ZAP if(cn & 0x01) ct = ct1; else ct = ct2; #endif // Send the next cycle information to the TMS server t1 = getTime(); if(err = tmsControl.setNextCycle(cn, ct)){ cerr << "Error: " << err.getString() << "\n"; } t2 = getTime(); printf("Send Next Cycle Info: %f TimeDiff: %f TimeTaken: %fms\n", t2 - tStart, t2 - tLast, (t2 - t1) * 1000.0); tLast = t2; } return err; } int main(int argc, char** argv){ BError err; BString host = "localhost"; TmsControl tmsControl; TmsProcess tmsProcess; if(argc == 2) host = argv[1]; // Connect to the Control service if(err = tmsControl.connectService(BString("//") + host + "/tmsControl")){ cerr << "Error: " << err.getString() << "\n"; return 1; } // Set the network priority high if(err = tmsControl.setPriority(BSocket::PriorityHigh)){ cerr << "Error: " << err.getString() << "\n"; return 1; } // Set the TmsServer thread priority high if(err = tmsControl.setProcessPriority(PriorityHigh)){ cerr << "Error: " << err.getString() << "\n"; return 1; } // Connect to the Process service if(err = tmsProcess.connectService(BString("//") + host + "/tmsProcess")){ cerr << "Error: " << err.getString() << "\n"; return 1; } // Start processing events if(err = tmsEventsProcess(tmsProcess, host)){ cerr << err.getString() + "\n"; return 1; } if(err = tmsControlLoop(tmsControl)){ cerr << "Error: " << err.getString() << "\n"; return 1; } return 0; }