Skip to content
Snippets Groups Projects
Commit 7da10d46 authored by Ruud Overeem's avatar Ruud Overeem
Browse files

Task #1418: Merged MAC-CEPfeedback Task 2857 in trunk.

parent 28dc358c
Branches
Tags
No related merge requests found
......@@ -24,8 +24,8 @@
#define CEPAPPLMGR_H
//# Includes
#include <ALC/ACAsyncClient.h>
#include <GCF/TM/GCF_Handler.h>
#include <ALC/ACAsyncClient.h>
#include <APL/APLCommon/CTState.h>
//# local includes
......
......@@ -9,3 +9,5 @@ lofar_add_bin_program(OnlineControl
OnlineControlMain.cc
OnlineControl.cc
CEPApplMgr.cc)
lofar_add_executable(tPVSSMapping tPVSSMapping.cc)
......@@ -20,20 +20,20 @@
//#
//# $Id$
#include <lofar_config.h>
#include <Common/LofarLogger.h>
#include <signal.h>
#include <Common/LofarLogger.h>
#include <Common/LofarLocators.h>
#include <Common/StreamUtil.h>
//#include <Common/lofar_vector.h>
//#include <Common/lofar_string.h>
#include <Common/ParameterSet.h>
#include <Common/ParameterRecord.h>
#include <Common/Exceptions.h>
#include <ApplCommon/StationInfo.h>
#include <GCF/PVSS/GCF_PVTypes.h>
#include <Common/SystemUtil.h>
#include <ApplCommon/StationInfo.h>
#include <ApplCommon/Observation.h>
#include <ApplCommon/LofarDirs.h>
#include <MACIO/MACServiceInfo.h>
#include <GCF/TM/GCF_Protocols.h>
#include <GCF/PVSS/GCF_PVTypes.h>
#include <APL/APLCommon/APL_Defines.h>
#include <APL/APLCommon/APLUtilities.h>
#include <APL/APLCommon/ControllerDefines.h>
......@@ -43,6 +43,7 @@
#include <PLC/PCCmd.h>
#include "OnlineControl.h"
#include <OTDB/TreeValue.h> // << need to include this after OnlineControl! ???
#include "PVSSDatapointDefs.h"
using namespace LOFAR::GCF::PVSS;
......@@ -53,6 +54,7 @@ using namespace std;
namespace LOFAR {
using namespace APLCommon;
using namespace ACC::ALC;
using namespace OTDB;
namespace CEPCU {
// static pointer to this object for signal handler
......@@ -64,6 +66,7 @@ static OnlineControl* thisOnlineControl = 0;
OnlineControl::OnlineControl(const string& cntlrName) :
GCFTask ((State)&OnlineControl::initial_state,cntlrName),
itsPropertySet (0),
itsBGPApplPropSet (0),
itsPropertySetInitialized (false),
itsParentControl (0),
itsParentPort (0),
......@@ -304,10 +307,9 @@ void OnlineControl::_databaseEventHandler(GCFEvent& event)
//
// initial_state(event, port)
//
// Setup all connections.
// Create my own propertySet
//
GCFEvent::TResult OnlineControl::initial_state(GCFEvent& event,
GCFPortInterface& port)
GCFEvent::TResult OnlineControl::initial_state(GCFEvent& event, GCFPortInterface& port)
{
LOG_INFO_STR ("initial:" << eventName(event) << "@" << port.getName());
......@@ -320,7 +322,8 @@ GCFEvent::TResult OnlineControl::initial_state(GCFEvent& event,
case F_INIT: {
// Get access to my own propertyset.
// uint32 obsID = globalParameterSet()->getUint32("Observation.ObsID");
string propSetName(createPropertySetName(PSN_ONLINE_CONTROL, getName()));
string obsDPname = globalParameterSet()->getString("_DPname");
string propSetName(createPropertySetName(PSN_ONLINE_CONTROL, getName(), obsDPname));
LOG_DEBUG_STR ("Activating PropertySet: "<< propSetName);
itsPropertySet = new RTDBPropertySet(propSetName,
PST_ONLINE_CONTROL,
......@@ -330,12 +333,12 @@ GCFEvent::TResult OnlineControl::initial_state(GCFEvent& event,
break;
case DP_CREATED: {
// NOTE: thsi function may be called DURING the construction of the PropertySet.
// NOTE: this function may be called DURING the construction of the PropertySet.
// Always exit this event in a way that GCF can end the construction.
DPCreatedEvent dpEvent(event);
LOG_DEBUG_STR("Result of creating " << dpEvent.DPname << " = " << dpEvent.result);
itsTimerPort->cancelAllTimers();
itsTimerPort->setTimer(0.0);
itsTimerPort->setTimer(0.5);
}
break;
......@@ -345,6 +348,62 @@ GCFEvent::TResult OnlineControl::initial_state(GCFEvent& event,
itsPropertySet->setValue(PN_FSM_CURRENT_ACTION, GCFPVString("initial"));
itsPropertySet->setValue(PN_FSM_ERROR, GCFPVString(""));
LOG_DEBUG ("Going to create BGPAppl datapoint");
TRAN(OnlineControl::propset_state); // go to next state.
}
break;
case F_CONNECTED:
ASSERTSTR (&port == itsParentPort, "F_CONNECTED event from port " << port.getName());
break;
case F_DISCONNECTED:
break;
default:
LOG_DEBUG_STR ("initial, default");
status = GCFEvent::NOT_HANDLED;
break;
}
return (status);
}
//
// propset_state(event, port)
//
// Connect to BGPAppl DP and start rest of tasks
//
GCFEvent::TResult OnlineControl::propset_state(GCFEvent& event, GCFPortInterface& port)
{
LOG_INFO_STR ("propset:" << eventName(event) << "@" << port.getName());
GCFEvent::TResult status = GCFEvent::HANDLED;
switch (event.signal) {
case F_ENTRY: {
// Get access to my own propertyset.
// uint32 obsID = globalParameterSet()->getUint32("Observation.ObsID");
string obsDPname = globalParameterSet()->getString("_DPname");
string propSetName(createPropertySetName(PSN_BGP_APPL, getName(), obsDPname));
LOG_DEBUG_STR ("Activating PropertySet: "<< propSetName);
itsBGPApplPropSet = new RTDBPropertySet(propSetName,
PST_BGP_APPL,
PSAT_RW,
this);
}
break;
case DP_CREATED: {
// NOTE: this function may be called DURING the construction of the PropertySet.
// Always exit this event in a way that GCF can end the construction.
DPCreatedEvent dpEvent(event);
LOG_DEBUG_STR("Result of creating " << dpEvent.DPname << " = " << dpEvent.result);
itsTimerPort->cancelAllTimers();
itsTimerPort->setTimer(0.5);
}
break;
case F_TIMER: { // must be timer that PropSet is online.
// start StopTimer for safety.
LOG_INFO_STR("Starting QUIT timer that expires 5 seconds after end of observation");
ptime now(second_clock::universal_time());
......@@ -361,15 +420,14 @@ GCFEvent::TResult OnlineControl::initial_state(GCFEvent& event,
break;
case F_CONNECTED:
ASSERTSTR (&port == itsParentPort,
"F_CONNECTED event from port " << port.getName());
ASSERTSTR (&port == itsParentPort, "F_CONNECTED event from port " << port.getName());
break;
case F_DISCONNECTED:
break;
default:
LOG_DEBUG_STR ("initial, default");
LOG_DEBUG_STR ("propset, default");
status = GCFEvent::NOT_HANDLED;
break;
}
......@@ -441,6 +499,7 @@ GCFEvent::TResult OnlineControl::active_state(GCFEvent& event, GCFPortInterface&
itsLogControlPort->send(announce);
// execute this state
_setState(CTState::CONNECT);
_setupBGPmappingTables();
_doBoot(); // start ACC's and boot them
break;
}
......@@ -560,6 +619,7 @@ GCFEvent::TResult OnlineControl::finishing_state(GCFEvent& event, GCFPortInterfa
}
case F_TIMER:
_passMetadatToOTDB();
GCFScheduler::instance()->stop();
break;
......@@ -572,6 +632,84 @@ GCFEvent::TResult OnlineControl::finishing_state(GCFEvent& event, GCFPortInterfa
return (status);
}
//
// _setupBGPmappingTables
//
void OnlineControl::_setupBGPmappingTables()
{
Observation theObs(globalParameterSet(), false);
int nrStreams = theObs.streamsToStorage.size();
LOG_DEBUG_STR("_setupBGPmapping: " << nrStreams << " streams found.");
// e.g. CS001 , [0,2,3,6] , [L36000_SAP000_SB000_uv.MS, ...] , [1,3,5,4]
GCFPValueArray ionodeArr;
GCFPValueArray locusArr;
GCFPValueArray adderArr;
GCFPValueArray writerArr;
GCFPValueArray dpArr;
GCFPValueArray dptypeArr;
uint prevPset = (nrStreams ? theObs.streamsToStorage[0].sourcePset : -1);
vector<string> locusVector;
vector<int> adderVector;
vector<int> writerVector;
vector<string> DPVector;
vector<string> DPtypeVector;
for (int i = 0; i < nrStreams; i++) {
if (theObs.streamsToStorage[i].sourcePset != prevPset) { // other Pset? write current vector to the database.
ionodeArr.push_back(new GCFPVInteger(prevPset));
{ stringstream os;
writeVector(os, locusVector);
locusArr.push_back (new GCFPVString(os.str()));
}
{ stringstream os;
writeVector(os, adderVector);
adderArr.push_back (new GCFPVString(os.str()));
}
{ stringstream os;
writeVector(os, writerVector);
writerArr.push_back(new GCFPVString(os.str()));
}
{ stringstream os;
writeVector(os, DPVector);
dpArr.push_back (new GCFPVString(os.str()));
}
{ stringstream os;
writeVector(os, DPtypeVector);
dptypeArr.push_back(new GCFPVString(os.str()));
}
// clear the collecting vectors
locusVector.clear();
adderVector.clear();
writerVector.clear();
DPVector.clear();
DPtypeVector.clear();
prevPset = theObs.streamsToStorage[i].sourcePset;
}
// extend vector with info
locusVector.push_back (theObs.streamsToStorage[i].destStorageNode);
adderVector.push_back (theObs.streamsToStorage[i].adderNr);
writerVector.push_back(theObs.streamsToStorage[i].writerNr);
DPVector.push_back (theObs.streamsToStorage[i].filename);
DPtypeVector.push_back(theObs.streamsToStorage[i].dataProduct);
}
itsBGPApplPropSet->setValue(PN_BGPA_IO_NODE_LIST, GCFPVDynArr(LPT_DYNINTEGER, ionodeArr));
itsBGPApplPropSet->setValue(PN_BGPA_LOCUS_NODE_LIST, GCFPVDynArr(LPT_DYNSTRING, locusArr));
itsBGPApplPropSet->setValue(PN_BGPA_ADDER_LIST, GCFPVDynArr(LPT_DYNSTRING, adderArr));
itsBGPApplPropSet->setValue(PN_BGPA_WRITER_LIST, GCFPVDynArr(LPT_DYNSTRING, writerArr));
itsBGPApplPropSet->setValue(PN_BGPA_DATA_PRODUCT_LIST, GCFPVDynArr(LPT_DYNSTRING, dpArr));
itsBGPApplPropSet->setValue(PN_BGPA_DATA_PRODUCT_TYPE_LIST, GCFPVDynArr(LPT_DYNSTRING, dptypeArr));
// release claimed memory.
for (int i = ionodeArr.size()-1; i>=0; i--) {
delete ionodeArr[i];
delete locusArr[i];
delete adderArr[i];
delete writerArr[i];
delete dpArr[i];
delete dptypeArr[i];
}
}
//
// _doBoot()
......@@ -695,6 +833,83 @@ void OnlineControl::_doQuit(void)
}
}
//
// _passMetadatToOTDB();
// THIS ROUTINE IS A MODIFIED COPY FROM PYTHONCONTROL.CC
//
void OnlineControl::_passMetadatToOTDB()
{
// No name specified?
uint32 obsID(globalParameterSet()->getUint32("Observation.ObsID", 0));
string feedbackFile = observationParset(obsID)+"_feedback";
LOG_INFO_STR ("Expecting metadata to be in file " << feedbackFile);
if (feedbackFile.empty()) {
return;
}
// read parameterset
ParameterSet metadata;
metadata.adoptFile(feedbackFile);
// Try to setup the connection with the database
string confFile = globalParameterSet()->getString("OTDBconfFile", "SASGateway.conf");
ConfigLocator CL;
string filename = CL.locate(confFile);
LOG_INFO_STR("Trying to read database information from file " << filename);
ParameterSet otdbconf;
otdbconf.adoptFile(filename);
string database = otdbconf.getString("SASGateway.OTDBdatabase");
string dbhost = otdbconf.getString("SASGateway.OTDBhostname");
OTDBconnection conn("paulus", "boskabouter", database, dbhost);
if (!conn.connect()) {
LOG_FATAL_STR("Cannot connect to database " << database << " on machine " << dbhost);
return;
}
LOG_INFO_STR("Connected to database " << database << " on machine " << dbhost);
TreeValue tv(&conn, getObservationNr(getName()));
// Loop over the parameterset and send the information to the KVTlogger.
// During the transition phase from parameter-based to record-based storage in OTDB the
// nodenames ending in '_' are implemented both as parameter and as record.
ParameterSet::iterator iter = metadata.begin();
ParameterSet::iterator end = metadata.end();
while (iter != end) {
string key(iter->first); // make destoyable copy
rtrim(key, "[]0123456789");
// bool doubleStorage(key[key.size()-1] == '_');
bool isRecord(iter->second.isRecord());
// isRecord doubleStorage
// --------------------------------------------------------------
// Y Y store as record and as parameters
// Y N store as parameters
// N * store parameter
if (!isRecord) {
LOG_DEBUG_STR("BASIC: " << iter->first << " = " << iter->second);
tv.addKVT(iter->first, iter->second, ptime(microsec_clock::local_time()));
}
else {
// if (doubleStorage) {
// LOG_DEBUG_STR("RECORD: " << iter->first << " = " << iter->second);
// tv.addKVT(iter->first, iter->second, ptime(microsec_clock::local_time()));
// }
// to store is a node/param values the last _ should be stipped of
key = iter->first; // destroyable copy
// string::size_type pos = key.find_last_of('_');
// key.erase(pos,1);
ParameterRecord pr(iter->second.getRecord());
ParameterRecord::const_iterator prIter = pr.begin();
ParameterRecord::const_iterator prEnd = pr.end();
while (prIter != prEnd) {
LOG_DEBUG_STR("ELEMENT: " << key+"."+prIter->first << " = " << prIter->second);
tv.addKVT(key+"."+prIter->first, prIter->second, ptime(microsec_clock::local_time()));
prIter++;
}
}
iter++;
}
LOG_INFO_STR(metadata.size() << " metadata values send to SAS");
}
// -------------------- Application-order administration --------------------
//
......
......@@ -65,15 +65,14 @@ public:
explicit OnlineControl(const string& cntlrName);
~OnlineControl();
// During the initial state all connections with the other programs are made.
GCFEvent::TResult initial_state (GCFEvent& e,
GCFPortInterface& p);
// Connect to our own propertyset.
GCFEvent::TResult initial_state (GCFEvent& e, GCFPortInterface& p);
// Connect to BGPAppl propset and start remaining tasks.
GCFEvent::TResult propset_state (GCFEvent& e, GCFPortInterface& p);
// Normal control mode.
GCFEvent::TResult active_state (GCFEvent& e,
GCFPortInterface& p);
GCFEvent::TResult active_state (GCFEvent& e, GCFPortInterface& p);
// Finishing mode.
GCFEvent::TResult finishing_state(GCFEvent& event,
GCFPortInterface& port);
GCFEvent::TResult finishing_state(GCFEvent& event, GCFPortInterface& port);
// Interrupthandler for switching to finisingstate when exiting the program
static void signalHandler (int signum);
......@@ -95,6 +94,7 @@ private:
OnlineControl(const OnlineControl&);
OnlineControl& operator=(const OnlineControl&);
void _setupBGPmappingTables();
void _doBoot();
void _doQuit();
void _finishController (uint16_t result);
......@@ -102,6 +102,7 @@ private:
void _disconnectedHandler (GCFPortInterface& port);
void _setState (CTState::CTstateNr newState);
void _databaseEventHandler(GCFEvent& event);
void _passMetadatToOTDB ();
// Send a command to all (or the first) applications.
void startNewState (CTState::CTstateNr newState,
......@@ -121,6 +122,7 @@ private:
// ----- datamembers -----
RTDBPropertySet* itsPropertySet;
RTDBPropertySet* itsBGPApplPropSet;
bool itsPropertySetInitialized;
// pointer to parent control task
......
// This file was generated by create_db_files v1.0 on Thu Mar 19 14:56:58 UTC 2009
// This file was generated by create_db_files v2.0 on Fri Apr 13 09:04:54 UTC 2012
#ifndef LOFAR_DEPLOYMENT_PVSSDATAPOINTS_H
#define LOFAR_DEPLOYMENT_PVSSDATAPOINTS_H
......@@ -42,7 +42,6 @@
#define PST_OBSERVATION "Observation"
#define PN_OBS_CLAIM_CLAIM_DATE "claim.claimDate"
#define PN_OBS_CLAIM_NAME "claim.name"
#define PN_OBS_RECEIVER_BITMAP "receiverBitmap"
#define PN_OBS_CLAIM_PERIOD "claimPeriod"
#define PN_OBS_PREPARE_PERIOD "preparePeriod"
#define PN_OBS_START_TIME "startTime"
......@@ -63,22 +62,68 @@
#define PN_OBS_BEAMS_DIRECTION_TYPE "Beams.directionType"
#define PN_OBS_BEAMS_BEAMLET_LIST "Beams.beamletList"
#define PN_OBS_BEAMS_SUBBAND_LIST "Beams.subbandList"
#define PN_OBS_TIED_ARRAY_BEAMS_BEAM_INDEX "TiedArrayBeams.beamIndex"
#define PN_OBS_TIED_ARRAY_BEAMS_ANGLE1 "TiedArrayBeams.angle1"
#define PN_OBS_TIED_ARRAY_BEAMS_ANGLE2 "TiedArrayBeams.angle2"
#define PN_OBS_TIED_ARRAY_BEAMS_DIRECTION_TYPE "TiedArrayBeams.directionType"
#define PN_OBS_TIED_ARRAY_BEAMS_DISPERSION "TiedArrayBeams.dispersion"
#define PN_OBS_TIED_ARRAY_BEAMS_COHERENT "TiedArrayBeams.coherent"
// ObservationControl
#define PSN_OBSERVATION_CONTROL "LOFAR_ObsSW_@observation@_ObservationControl"
#define PST_OBSERVATION_CONTROL "ObservationControl"
#define PN_OBSCTRL_COMMAND "command"
// Adder
#define PSN_ADDER "@adder@"
#define PST_ADDER "Adder"
#define PN_ADD_DROPPING "dropping"
#define PN_ADD_NR_BLOCKS_DROPPED "nrBlocksDropped"
#define PN_ADD_DATA_PRODUCT_TYPE "dataProductType"
#define PN_ADD_FILE_NAME "fileName"
#define PN_ADD_STORAGE_NODE "storageNode"
#define PN_ADD_DIRECTORY "directory"
#define PN_ADD_OBSERVATION_NAME "observationName"
// InputBuffer
#define PSN_INPUT_BUFFER "@inputbuffer@"
#define PST_INPUT_BUFFER "InputBuffer"
#define PN_IPB_STATION_NAME "stationName"
#define PN_IPB_STREAM0_BLOCKS_IN "stream0.blocksIn"
#define PN_IPB_STREAM0_PERC_BAD "stream0.percBad"
#define PN_IPB_STREAM0_REJECTED "stream0.rejected"
#define PN_IPB_STREAM1_BLOCKS_IN "stream1.blocksIn"
#define PN_IPB_STREAM1_PERC_BAD "stream1.percBad"
#define PN_IPB_STREAM1_REJECTED "stream1.rejected"
#define PN_IPB_STREAM2_BLOCKS_IN "stream2.blocksIn"
#define PN_IPB_STREAM2_PERC_BAD "stream2.percBad"
#define PN_IPB_STREAM2_REJECTED "stream2.rejected"
#define PN_IPB_STREAM3_BLOCKS_IN "stream3.blocksIn"
#define PN_IPB_STREAM3_PERC_BAD "stream3.percBad"
#define PN_IPB_STREAM3_REJECTED "stream3.rejected"
#define PN_IPB_LATE "late"
#define PN_IPB_IO_TIME "IOTime"
// Storage
#define PSN_STORAGE "@storage@"
#define PST_STORAGE "Storage"
#define PN_STR_TIME "time"
#define PN_STR_COUNT "count"
#define PN_STR_DROPPED "dropped"
// OnlineControl
#define PSN_ONLINE_CONTROL "LOFAR_ObsSW_@observation@_OnlineControl"
#define PST_ONLINE_CONTROL "OnlineControl"
// Correlator
#define PSN_CORRELATOR "LOFAR_ObsSW_@observation@_OnlineControl_Correlator"
#define PST_CORRELATOR "Correlator"
// StorageAppl
#define PSN_STORAGE_APPL "LOFAR_ObsSW_@observation@_OnlineControl_StorageAppl"
#define PST_STORAGE_APPL "StorageAppl"
// BGPAppl
#define PSN_BGP_APPL "LOFAR_ObsSW_@observation@_OnlineControl_BGPAppl"
#define PST_BGP_APPL "BGPAppl"
#define PN_BGPA_IO_NODE_LIST "ioNodeList"
#define PN_BGPA_LOCUS_NODE_LIST "locusNodeList"
#define PN_BGPA_ADDER_LIST "adderList"
#define PN_BGPA_WRITER_LIST "writerList"
#define PN_BGPA_DATA_PRODUCT_LIST "dataProductList"
#define PN_BGPA_DATA_PRODUCT_TYPE_LIST "dataProductTypeList"
// Cabinet
#define PSN_CABINET "LOFAR_PIC_@cabinet@"
......@@ -217,10 +262,15 @@
#define PN_RCU_TRIGGER_FILTER "Trigger.filter"
#define PN_RCU_TRIGGER_WINDOW "Trigger.window"
#define PN_RCU_TRIGGER_OPERATING_MODE "Trigger.operatingMode"
#define PN_RCU_TRIGGER_COEFF0 "Trigger.coeff0"
#define PN_RCU_TRIGGER_COEFF1 "Trigger.coeff1"
#define PN_RCU_TRIGGER_COEFF2 "Trigger.coeff2"
#define PN_RCU_TRIGGER_COEFF3 "Trigger.coeff3"
#define PN_RCU_TRIGGER_TRIGGER_MODE "Trigger.triggerMode"
#define PN_RCU_TRIGGER_FILTER0_COEFF0 "Trigger.filter0.coeff0"
#define PN_RCU_TRIGGER_FILTER0_COEFF1 "Trigger.filter0.coeff1"
#define PN_RCU_TRIGGER_FILTER0_COEFF2 "Trigger.filter0.coeff2"
#define PN_RCU_TRIGGER_FILTER0_COEFF3 "Trigger.filter0.coeff3"
#define PN_RCU_TRIGGER_FILTER1_COEFF0 "Trigger.filter1.coeff0"
#define PN_RCU_TRIGGER_FILTER1_COEFF1 "Trigger.filter1.coeff1"
#define PN_RCU_TRIGGER_FILTER1_COEFF2 "Trigger.filter1.coeff2"
#define PN_RCU_TRIGGER_FILTER1_COEFF3 "Trigger.filter1.coeff3"
// TBBoard
#define PSN_TB_BOARD "LOFAR_PIC_@cabinet@_@subrack@_@TBBoard@"
......@@ -294,7 +344,7 @@
#define PN_ANT_RCUY "RCUY"
#define PN_ANT_DELTAX "deltaX"
#define PN_ANT_DELTAY "deltaY"
#define PN_ANT_DELTAH "deltaH"
#define PN_ANT_DELTAZ "deltaZ"
// StnObservation
#define PSN_STN_OBSERVATION "LOFAR_ObsSW_@observation@"
......@@ -302,6 +352,9 @@
#define PN_OBS_NAME "name"
#define PN_OBS_CLAIM_CLAIM_DATE "claim.claimDate"
#define PN_OBS_CLAIM_NAME "claim.name"
#define PN_OBS_RECEIVER_BITMAP "receiverBitmap"
#define PN_OBS_HB_ABITMAP "HBAbitmap"
#define PN_OBS_LB_ABITMAP "LBAbitmap"
// BeamControl
#define PSN_BEAM_CONTROL "LOFAR_ObsSW_@observation@_BeamControl"
......@@ -338,5 +391,6 @@
#define PN_TBC_TRIGGER_PEAK_VALUE "trigger.peakValue"
#define PN_TBC_TRIGGER_FLAGS "trigger.flags"
#define PN_TBC_TRIGGER_TABLE "trigger.table"
#define PN_TBC_TRIGGER_MISSED "trigger.missed"
#endif
......@@ -185,6 +185,10 @@ bool PythonControl::_startPython(const string& pythonProg,
}
}
// Readin parameters from the obsercationfile.
itsFeedbackFile = observationParset(obsID)+"_feedback";
LOG_INFO_STR ("Expect metadata to be in file " << itsFeedbackFile);
// construct system command
string startCmd;
string startScript("startPython.sh");
......@@ -203,13 +207,23 @@ bool PythonControl::_startPython(const string& pythonProg,
myHostname(true).c_str(), parentService.c_str(), itsPythonName.c_str());
}
LOG_INFO_STR("About to start: " << startCmd);
int32 result = system (startCmd.c_str());
LOG_INFO_STR ("Result of start = " << result);
// Readin parameters from the obsercationfile.
itsFeedbackFile = observationParset(obsID)+"_feedback";
LOG_INFO_STR ("Expecting metadata in file " << itsFeedbackFile);
#if 1
FILE* pipe = popen(startCmd.c_str(), "r");
if (!pipe) {
LOG_FATAL_STR("Couldn't execute '" << startCmd << ", errno = " << strerror(errno));
return (false);
}
LOG_INFO("Output of command: ...");
while (!feof(pipe)) {
char buffer[1024];
LOG_INFO_STR(fgets(buffer, 1024, pipe));
}
LOG_INFO("... end of command output");
int result = pclose(pipe);
#else
int result = system (startCmd.c_str());
#endif
LOG_INFO_STR ("Result of command = " << result);
if (result == -1) {
return (false);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment