Changeset 19452
- Timestamp:
- 03/28/19 18:40:40 (6 years ago)
- Location:
- trunk/FACT++
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/scripts/Main.js
r19014 r19452 194 194 // ================================================================ 195 195 196 function OpenLid( )196 function OpenLid(fast) 197 197 { 198 198 /* … … 227 227 dim.log("Camera response: "+ret.data.replace(/\n/g,"/")+" ["+ret.rc+"]"); 228 228 } 229 230 if (!fast) 231 return; 232 229 233 dim.wait("LID_CONTROL", "Open", 30000); 230 234 … … 1508 1512 // ...no drs calibration was done yet 1509 1513 var drscal = (run%4==0 && (remaining>15 && diff>70)) || diff==null; 1510 1514 1511 1515 if (point) 1512 1516 { … … 1545 1549 } 1546 1550 1547 if (drscal )1551 if (drscal && !obs[sub].nodrs) 1548 1552 { 1549 1553 doDrsCalibration("data"); // will turn voltage off … … 1562 1566 continue; 1563 1567 1564 OpenLid(); 1565 1566 // This is now th right time to wait for th drive to be stable 1567 dim.wait("DRIVE_CONTROL", "OnTrack", 150000); // 110s for turning and 30s for stabilizing 1568 OpenLid(obs[sub].grb); 1569 1570 // This is now the right time to wait for the drive to be stable 1571 if (!obs[sub].grb) 1572 dim.wait("DRIVE_CONTROL", "OnTrack", 150000); // 110s for turning and 30s for stabilizing 1573 else 1574 v8.timeout(150000, function() { if (dim.state("DRIVE_CONTROL").name=="Approaching" || dim.state("DRIVE_CONTROL").name=="Tracking" || dim.state("DRIVE_CONTROL").name=="OnTrack") return true; }); 1568 1575 1569 1576 // Now check the voltage... (do not start a lot of stuff just to do nothing) … … 1578 1585 // and wait for the feedback to get stable 1579 1586 service_feedback.voltageOn(); 1580 service_feedback.waitForVoltageOn(); 1587 if (!obs[sub].grb) 1588 service_feedback.waitForVoltageOn(); 1589 1590 // For the first run to be taken (ratecontrol) 1591 // Lid must be != Closed 1592 // Drive must be >= Moving 1593 // Setting the threshold can take 2-3 seconds 1594 1595 if (obs[sub].grb && run==0) 1596 { 1597 // Instead of a pedestal run, we take a very short grb mode run 1598 // which is a classical data run but does not change the thresholds 1599 // This gives the voltages (typ. 5s) and currents (typ. 3s) time to 1600 // stabilize and threshold setting for the next run will be 1601 // reliable and fast but we have data already 1602 dim.log("Starting GRB mode."); 1603 1604 // Whatever we do... it does not make sense to start with a closed lid 1605 // If the lid is not yet open, wait for the lid to be open and 1606 // go on as usual. 1607 if (dim.state("LID_CONTROL")!="Open") 1608 { 1609 dim.wait("LID_CONTROL", "Open", 30000); 1610 service_feedback.waitForVoltageOn(); 1611 } 1612 1613 // Doing this manually makes it more flexible but turns off 1614 // automatic Critical mode checking of the feedback and 1615 // automatic reconnect 1616 var nextrun = sub_startrun.get().obj['next']; 1617 dim.log("Take run %3d".$(nextrun)+" [grb-mode]"); 1618 1619 dim.send("MCP/START", -1, -1, "grb"); // Use previous threshold settings if ratecontrol "InProgress" 1620 dim.wait("MCP", "TakingData", 15000); 1621 1622 dim.wait("FEEDBACK", "InProgress", 45000); // This is most likely the first to happen 1623 dim.wait("DRIVE_CONTROL", "Tracking", 150000); // 110s for turning and 30s for stabilizing 1624 1625 v8.wait(1000); // By now we should have collected the required three current events in FEEDBACK 1626 // Current are averaged over 10s. So by now we should have a reasonable idea of the brightness of the sky 1627 // Individual pixels might still suffer wrong settings 1628 // Starting a new run takes less than 2s (for 60s runs this is 3%) 1629 } 1581 1630 1582 1631 // If pointing had changed, do calibration 1583 if (!irq && point )1632 if (!irq && point && !obs[sub].grb) 1584 1633 { 1585 1634 dim.log("Starting calibration."); … … 1603 1652 var twilight = Sun.horizon(-16).isUp; 1604 1653 1605 if (twilight )1654 if (twilight || obs[sub].grb) 1606 1655 { 1607 1656 for (var i=0; i<5 && !irq; i++) -
trunk/FACT++/src/gcn.cc
r19429 r19452 1 1 #include <functional> 2 #include <boost/algorithm/string/join.hpp> 2 3 3 4 #include "Dim.h" … … 16 17 17 18 #include "HeadersGCN.h" 19 #include "HeadersToO.h" 18 20 19 21 #include <QtXml/QDomDocument> … … 44 46 Time fLastKeepAlive; 45 47 46 GCN::PaketType_t GetType(const QDomElement &what)48 QString GetParamValue(const QDomElement &what, const string &name) 47 49 { 48 50 const QDomNodeList param = what.elementsByTagName("Param"); … … 50 52 { 51 53 const QDomElement elem = param.at(i).toElement(); 52 if (elem.attribute("name").toStdString()!="Packet_Type") 53 continue; 54 55 const uint16_t val = elem.attribute("value").toUInt(); 56 const auto it = fTypes.find(val); 57 if (it!=fTypes.end()) 58 return it->second; 59 60 Warn("Unknown paket type "+to_string(val)+"."); 61 } 62 54 if (elem.attribute("name").toStdString()==name) 55 return elem.attribute("value"); 56 } 57 58 return ""; 59 } 60 61 GCN::PaketType_t GetType(const QDomElement &what) 62 { 63 const auto value = GetParamValue(what, "Packet_Type"); 64 if (value.isEmpty()) 65 return { -1, "", "" }; 66 67 const uint16_t val = value.toUInt(); 68 const auto it = fTypes.find(val); 69 if (it!=fTypes.end()) 70 return it->second; 71 72 Warn("Unknown paket type "+to_string(val)+"."); 63 73 return { -1, "", "" }; 64 74 } 65 66 75 67 76 int ProcessXml(const QDomElement &root) … … 117 126 return -1; 118 127 128 const GCN::PaketType_t ptype = GetType(what); 129 119 130 const QDomElement date = who.firstChildElement("Date"); 120 131 const QDomElement author = who.firstChildElement("Author"); … … 135 146 const QDomElement errad = pos2d.firstChildElement("Error2Radius"); 136 147 137 if (date.isNull() || author.isNull() || sname.isNull() || //desc.isNull() || 138 obsdat.isNull() || obsloc.isNull() || coord.isNull() || time.isNull() || 139 pos2d.isNull() || name1.isNull() || name2.isNull() || val2.isNull() || 140 c1.isNull() || c2.isNull() || errad.isNull()) 148 const bool is_gw = ptype.type==150 || ptype.type==151 || ptype.type==153; 149 150 vector<string> missing; 151 if (date.isNull()) 152 missing.emplace_back("Date"); 153 if (author.isNull()) 154 missing.emplace_back("Author"); 155 if (sname.isNull() && !is_gw) 156 missing.emplace_back("shortName"); 157 if (obsdat.isNull()) 158 missing.emplace_back("ObsDataLocation"); 159 if (obsloc.isNull()) 160 missing.emplace_back("ObservationLocation"); 161 if (coord.isNull()) 162 missing.emplace_back("AstroCoords"); 163 if (time.isNull()) 164 missing.emplace_back("Time/TimeInstant/ISOTime"); 165 if (pos2d.isNull() && !is_gw) 166 missing.emplace_back("Position2D"); 167 if (name1.isNull() && !is_gw) 168 missing.emplace_back("Name1"); 169 if (name1.isNull() && !is_gw) 170 missing.emplace_back("Name2"); 171 if (val2.isNull() && !is_gw) 172 missing.emplace_back("Value2"); 173 if (c1.isNull() && !is_gw) 174 missing.emplace_back("C1"); 175 if (c2.isNull() && !is_gw) 176 missing.emplace_back("C2"); 177 if (errad.isNull() && !is_gw) 178 missing.emplace_back("Error2Radius"); 179 180 if (!missing.empty()) 181 { 182 Warn("Missing elements: "+boost::algorithm::join(missing, ", ")); 141 183 return -1; 142 143 const GCN::PaketType_t ptype = GetType(what); 184 } 144 185 145 186 // 59/31: Konus LC / IPN raw [observation] … … 195 236 const string unit = pos2d.attribute("unit").toStdString(); 196 237 197 const double ra = c1.text().toDouble(); 198 const double dec = c2.text().toDouble(); 199 const double err = errad.text().toDouble(); 238 const uint32_t trig = GetParamValue(what, "TrigID").toUInt(); 239 const double ra = c1.text().toDouble(); 240 const double dec = c2.text().toDouble(); 241 const double err = errad.text().toDouble(); 200 242 201 243 const string n1 = name1.text().toStdString(); … … 212 254 Out() << " " << setw(5) << "ERR" << "= " << err << unit << '\n'; 213 255 214 if (n1=="RA" && n2=="Dec" && unit=="deg") 256 const bool has_coordinates = n1=="RA" && n2=="Dec" && unit=="deg"; 257 258 if (has_coordinates) 215 259 { 260 const ToO::DataGRB data = 261 { 262 .type = ptype.type, 263 .trigid = trig, 264 .ra = ra, 265 .dec = dec, 266 .err = err, 267 }; 268 269 Info("Sending ToO #"+to_string(trig)+" ["+role+"]"); 270 Dim::SendCommandNB("TARGET_OF_OPPORTUNITY/SCHEDULE_GCN", data); 271 272 /* 216 273 const double jd = Time().JD(); 217 274 … … 244 301 Out() << '\n'; 245 302 } 303 */ 246 304 } 247 305
Note:
See TracChangeset
for help on using the changeset viewer.