diff --git a/MAC/APL/PIC/MIS/src/MISSession.cc b/MAC/APL/PIC/MIS/src/MISSession.cc index 5da25b02039d2e79fc1e5867ed4e590cb0f303f5..bb36e00a33b4655f8da6154f0930ca0f4e7d6a79 100644 --- a/MAC/APL/PIC/MIS/src/MISSession.cc +++ b/MAC/APL/PIC/MIS/src/MISSession.cc @@ -712,6 +712,7 @@ GCFEvent::TResult MISSession::getSubbandStatistics_state(GCFEvent& e, GCFPortInt ackout.rcu_settings[rcuout] = ack.settings()(rcuout).getRaw(); } + // // subscribe to statistics updates RSPGetstatsEvent getstats; @@ -857,6 +858,8 @@ GCFEvent::TResult MISSession::getAntennaCorrelation_state(GCFEvent& e, GCFPortIn static MISAntennaCorrelationMatrixRequestEvent* pIn(0); //MAXMOD ssize_t maxsend; + static int N_HBA = 0; + static int N_LBA = 0; switch (e.signal) { @@ -869,7 +872,11 @@ GCFEvent::TResult MISSession::getAntennaCorrelation_state(GCFEvent& e, GCFPortIn //ackout.invalid = new uint8[_nrOfRCUs]; ackout.invalid = new uint32[_nrOfRCUs]; ackout.acmdataNOE = _nrOfRCUs * _nrOfRCUs; - //ackout.data = new double[_nrOfRCUs * 512]; + ackout.geoposNOE = 3; + ackout.geopos = new double[3]; //lat,lon,h + ackout.antcoordsNOE = _nrOfRCUs * 3 * 2; + ackout.antcoords = new double[_nrOfRCUs * 3 * 2]; //xyz Xpol, xyz Ypol + //ackout.data = new double[_nrOfRCUs * 512]; // PROBLEM why doesn't this give an error? I see no 'data' element } assert(_pRememberedEvent); pIn = (MISAntennaCorrelationMatrixRequestEvent*) _pRememberedEvent; @@ -934,11 +941,29 @@ GCFEvent::TResult MISSession::getAntennaCorrelation_state(GCFEvent& e, GCFPortIn break; } + //MAXMOD guess observing freq (Low or High) + N_HBA = 0; N_LBA = 0; + for (int rcuout = 0; rcuout < _nrOfRCUs; rcuout++) + { + ackout.rcu_settings[rcuout] = ack.settings()(rcuout).getRaw(); + //determine RCU mode and hence array 'LBA' or 'HBA' + //Ignore possibility of subarrays, for now. + //see RCUSettings.h + //This might be insufficient -- perhaps not all ON RCUs are being used. should check somehow. + //int nyqzone = ack.settings()(rcuout).getNyquistZone(); + int rcumode = ack.settings()(rcuout).getMode(ackout.rcu_settings[rcuout]); + if ((rcumode >= 1) && (rcumode <= 4)) { + N_LBA++ ; + } + if ((rcumode >= 5) && (rcumode <= 7)) { + N_HBA++ ; + } + // rcumode = -1 => indeterminate RCU mode + // rcumode = 0 => RCU off + } + LOG_DEBUG(formatString("MAXMOD N_LBA = %d, N_HBA = %d",N_LBA, N_HBA)); + //MAXMOD do as rspctl does - for (int rcuout = 0; rcuout < _nrOfRCUs; rcuout++){ - ackout.rcu_settings[rcuout] = ack.settings()(rcuout).getRaw(); - } - // SET subbands for XC RSPSetsubbandsEvent setsubbands; @@ -1033,19 +1058,102 @@ GCFEvent::TResult MISSession::getAntennaCorrelation_state(GCFEvent& e, GCFPortIn setCurrentTime(ackout.timestamp_sec, ackout.timestamp_nsec); //hand back the antenna coords - vector<string> ArrayNames = _daemon.m_arrays.getNameList(); - vector<string>::iterator iter = ArrayNames.begin(); - vector<string>::iterator end = ArrayNames.end(); - while (iter != end) { + //arrayname from obs frequency (Low or High) + // I have been assured that working stations will either be "LBA" or "HBA" + //How do I tell which array ('HBA' or 'LBA') to hand back? from ackout.rcu_settings. + //Ignore possibility of subarrays, for now. + string targetarrayname; + if ((N_LBA == 0) && (N_HBA == 0)){ //all RCUs off + targetarrayname = "LBA"; //doesnt matter + } + if (N_LBA > N_HBA) { + targetarrayname = "LBA"; + } + if (N_LBA < N_HBA) { + targetarrayname = "HBA"; + } + if (N_LBA == N_HBA) { //confused + targetarrayname = "LBA"; + } + + //search for AntennaArray with that name; + // I have been assured that working stations will either be "LBA" or "HBA" + // but if none found, special case: test station has FTS-1-LBA, FTS-1-HBA + // otherwise, return zeros + const CAL::AntennaArray * targetarray = _daemon.m_arrays.getByName(targetarrayname); + if (targetarray == NULL){ + if (targetarrayname == "LBA") { + targetarrayname = "FTS-1-LBA"; + } + else { + targetarrayname = "FTS-1-HBA"; + } + targetarray = _daemon.m_arrays.getByName(targetarrayname); + } + if (targetarray != NULL){ + LOG_DEBUG(formatString("MAXMOD N_LBA=%d, N_HBA=%d, targetarray %s",N_LBA,N_HBA,targetarray->getName().c_str())); + } + else{ + LOG_DEBUG(formatString("MAXMOD N_LBA=%d, N_HBA=%d, targetarray is NULL",N_LBA, N_HBA)); + } + + //unsigned int ndimfoo = targetarray->getGeoLoc().dimensions(); + //LOG_DEBUG(formatString("MAXMOD rank GeoLoc = %u",ndimfoo)); + //for (unsigned int i = 0; i < ndimfoo; i++){ + //LOG_DEBUG(formatString("MAXMOD size of dim %u of GeoLoc = %u",i, targetarray->getGeoLoc().extent(i))); + //} + //ndimfoo = targetarray->getAntennaPos().dimensions(); + //LOG_DEBUG(formatString("MAXMOD rank AntennaPos = %u",ndimfoo)); + //for (unsigned int i = 0; i < ndimfoo; i++){ + // LOG_DEBUG(formatString("MAXMOD size of dim %u of AntennaPos = %u",i, targetarray->getAntennaPos().extent(i))); + //} + + if (targetarray != NULL){ + for (int i = 0; i < targetarray->getGeoLoc().extent(firstDim); i++){ + //ackout.geopos[i] = *(const_cast<double *>(targetarray->getGeoLoc()(i).data())); + ackout.geopos[i] = targetarray->getGeoLoc()(i); + LOG_DEBUG(formatString("MAXMOD ackout.geopos[%d]=%f",i,ackout.geopos[i])); + } + + for (int i = 0; i < targetarray->getAntennaPos().extent(firstDim) ; i ++){ + //ackout.antcoords[i*6] = *(const_cast<double *>(targetarray->getAntennaPos()(i,0,0).data())); + ackout.antcoords[i*6] = targetarray->getAntennaPos()(i,0,0); + ackout.antcoords[i*6+1] = targetarray->getAntennaPos()(i,0,1); + ackout.antcoords[i*6+2] = targetarray->getAntennaPos()(i,0,2); + ackout.antcoords[i*6+3] = targetarray->getAntennaPos()(i,1,0); + ackout.antcoords[i*6+4] = targetarray->getAntennaPos()(i,1,1); + ackout.antcoords[i*6+5] = targetarray->getAntennaPos()(i,1,2); + LOG_DEBUG(formatString("MAXMOD AntennaPos i=%d",i)); + //LOG_DEBUG(formatString("MAXMOD (Xpol-x1) ackout.antcoords[%d]=%f",i*6,ackout.antcoords[i*6])); + } + } + else { + //No matching array found in config file -- return obviously wrong values + LOG_DEBUG(formatString("MAXMOD No Matching AntennaArray, returning [1],[1]")); + ackout.geoposNOE = 1; + //ackout.geopos = new double[1]; + ackout.geopos[0] = 1; + ackout.antcoordsNOE = 1; + //ackout.antcoords = new double[1]; + ackout.antcoords[0] = 1; + } + + //vector<string> ArrayNames = _daemon.m_arrays.getNameList(); + //vector<string>::iterator iter = ArrayNames.begin(); + //vector<string>::iterator end = ArrayNames.end(); + //while (iter != end) { //cout << "name :" << iter->first << endl; //cout << "spectralwindow:" << iter->second->getSPW().getName() << endl; //cout << "RCUmask :" << iter->second->getRCUMask() << endl; - const CAL::AntennaArray * somearray = _daemon.m_arrays.getByName(*iter); + //const CAL::AntennaArray * somearray = _daemon.m_arrays.getByName(*iter); //cout << "MISSESSION: iter :" << *iter << endl; //cout << "MISSESSION: somearray.getName() :" << somearray->getName() << endl; - LOG_DEBUG(formatString("MAXMOD Array %s",(*iter).c_str())); - iter++; - } + //LOG_DEBUG(formatString("MAXMOD Array %s",(*iter).c_str())); + //LOG_DEBUG(formatString("MAXMOD somearray %s",somearray->getName().c_str())); + //LOG_DEBUG_STR("MAXMOD getGeoLoc: :" << somearray->getGeoLoc()); + //iter++; + //} + maxsend = _missPort.send(ackout); LOG_DEBUG(formatString("MAXMOD %d response of _missPort.send(ackout).size",maxsend)); diff --git a/MAC/APL/PIC/MIS/src/MIS_Protocol.prot b/MAC/APL/PIC/MIS/src/MIS_Protocol.prot index cf934336db416d8618255cb4b3c70ee3980482f6..15a1192e645b54977be3e4fed8ff73a4067d1648 100644 --- a/MAC/APL/PIC/MIS/src/MIS_Protocol.prot +++ b/MAC/APL/PIC/MIS/src/MIS_Protocol.prot @@ -744,6 +744,14 @@ event = { name = "subband_selection"; type = "uint16"; }; + param = { + name = "geopos"; // station geographic location + type = "double[]"; + }; + param = { + name = "antcoords"; // antenna coordinates (Xpol xyz, Ypol xyz) + type = "double[]"; + }; param = { // I cannot figure out how arrays automatically get arrayNOE class members // I cannot get the acmdata blitz array to behave similarly. @@ -754,7 +762,7 @@ event = { param = { name = "acmdata"; // antenna correlation matrix //type = "double[]"; // *** FORMAT TO BE DEFINED *** - type = "XCStatistics"; // *** FORMAT TO BE DEFINED *** + type = "XCStatistics"; userdefined; }; };