diff --git a/libindi/drivers/dome/dome_simulator.cpp b/libindi/drivers/dome/dome_simulator.cpp index 2a08af4..52729e7 100644 --- a/libindi/drivers/dome/dome_simulator.cpp +++ b/libindi/drivers/dome/dome_simulator.cpp @@ -274,6 +274,12 @@ IPState DomeSim::MoveRel(double azDiff) IPState DomeSim::Park() { + if (INDI::Dome::isLocked()) + { + DEBUG(INDI::Logger::DBG_SESSION, "Cannot Park Dome when mount is locking. See: Telescope parking policy, in options tab"); + return IPS_ALERT; + } + targetAz = DomeParamN[1].value; Dome::ControlShutter(SHUTTER_CLOSE); Dome::MoveAbs(GetAxis1Park()); diff --git a/libindi/drivers/dome/roll_off.cpp b/libindi/drivers/dome/roll_off.cpp index 694416c..98f27b1 100644 --- a/libindi/drivers/dome/roll_off.cpp +++ b/libindi/drivers/dome/roll_off.cpp @@ -76,7 +76,6 @@ RollOff::RollOff() { fullOpenLimitSwitch = ISS_ON; fullClosedLimitSwitch = ISS_OFF; - IsTelescopeParked=false; MotionRequest=0; SetDomeCapability(DOME_CAN_ABORT | DOME_CAN_PARK); @@ -93,39 +92,11 @@ bool RollOff::initProperties() addAuxControls(); - IDSnoopDevice(ActiveDeviceT[0].text,"TELESCOPE_PARK"); - IUFillSwitch(&ParkableWhenScopeUnparkedS[0], "Enable", "", ISS_OFF); - IUFillSwitch(&ParkableWhenScopeUnparkedS[1], "Disable", "", ISS_ON); - IUFillSwitchVector(&ParkableWhenScopeUnparkedSP, ParkableWhenScopeUnparkedS, 2, getDeviceName(), "DOME_PARKABLEWHENSCOPEUNPARKED", "Scope park aware", OPTIONS_TAB, IP_RW, ISR_1OFMANY, 0, IPS_IDLE); - return true; } bool RollOff::ISSnoopDevice (XMLEle *root) { - XMLEle *ep=NULL; - const char *propName = findXMLAttValu(root, "name"); - if (!strcmp("TELESCOPE_PARK", propName)) - { - for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0)) - { - const char *elemName = findXMLAttValu(ep, "name"); - if (!strcmp(elemName, "PARK")) - { - if (!strcmp(pcdataXMLEle(ep), "On")) - { - DEBUG(INDI::Logger::DBG_DEBUG, "snooped park state PARKED"); - IsTelescopeParked = true; - } - else - { - DEBUG(INDI::Logger::DBG_DEBUG, "snooped park state UNPARKED"); - IsTelescopeParked = false; - } - } - } - return true; - } return INDI::Dome::ISSnoopDevice(root); } @@ -175,24 +146,6 @@ const char * RollOff::getDefaultName() bool RollOff::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n) { - if(strcmp(dev,getDeviceName())==0) - { - if (!strcmp(name, ParkableWhenScopeUnparkedSP.name)) - { - IUUpdateSwitch(&ParkableWhenScopeUnparkedSP, states, names, n); - - ParkableWhenScopeUnparkedSP.s = IPS_OK; - - if (ParkableWhenScopeUnparkedS[0].s == ISS_ON) - DEBUG(INDI::Logger::DBG_WARNING, "Scope park aware is enabled. Roof will not close when a snooped unparked telescope exists"); - else - DEBUG(INDI::Logger::DBG_SESSION, "Scope park aware is disabled. Roof can close when scope unparked or unknown. Only enable this option is parking the dome at any time will not cause damage to any equipment."); - - IDSetSwitch(&ParkableWhenScopeUnparkedSP, NULL); - - return true; - } - } return INDI::Dome::ISNewSwitch(dev, name, states, names, n); } @@ -203,10 +156,6 @@ bool RollOff::updateProperties() if (isConnected()) { SetupParms(); - defineSwitch(&ParkableWhenScopeUnparkedSP); - } else - { - deleteProperty(ParkableWhenScopeUnparkedSP.name); } return true; @@ -217,12 +166,6 @@ bool RollOff::Disconnect() return true; } -bool RollOff::isTelescopeParked() -{ - return IsTelescopeParked; -} - - void RollOff::TimerHit() { @@ -269,7 +212,6 @@ void RollOff::TimerHit() bool RollOff::saveConfigItems(FILE *fp) { - IUSaveConfigSwitch(fp, &ParkableWhenScopeUnparkedSP); return INDI::Dome::saveConfigItems(fp); } @@ -295,9 +237,9 @@ IPState RollOff::Move(DomeDirection dir, DomeMotionCommand operation) DEBUG(INDI::Logger::DBG_WARNING, "Roof is already fully closed."); return IPS_ALERT; } - else if (dir == DOME_CCW && isTelescopeParked() == false && ParkableWhenScopeUnparkedS[0].s == ISS_ON) + else if (dir == DOME_CCW && INDI::Dome::isLocked()) { - DEBUG(INDI::Logger::DBG_WARNING, "Cannot close roof until the telescope is parked. Please park the scope or disable Scope park aware in the options"); + DEBUG(INDI::Logger::DBG_WARNING, "Cannot close dome when mount is locking. See: Telescope parkng policy, in options tab"); return IPS_ALERT; } diff --git a/libindi/drivers/dome/roll_off.h b/libindi/drivers/dome/roll_off.h index 726a658..5c2323b 100644 --- a/libindi/drivers/dome/roll_off.h +++ b/libindi/drivers/dome/roll_off.h @@ -36,15 +36,14 @@ class RollOff : public INDI::Dome virtual bool initProperties(); const char *getDefaultName(); bool updateProperties(); - virtual bool ISSnoopDevice (XMLEle *root); virtual bool ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n); virtual bool saveConfigItems(FILE *fp); + virtual bool ISSnoopDevice (XMLEle *root); protected: bool Connect(); bool Disconnect(); - bool isTelescopeParked(); void TimerHit(); @@ -56,14 +55,10 @@ class RollOff : public INDI::Dome virtual bool getFullOpenedLimitSwitch(); virtual bool getFullClosedLimitSwitch(); - ISwitch ParkableWhenScopeUnparkedS[2]; - ISwitchVectorProperty ParkableWhenScopeUnparkedSP; - private: ISState fullOpenLimitSwitch; ISState fullClosedLimitSwitch; - bool IsTelescopeParked; double MotionRequest; struct timeval MotionStart; diff --git a/libindi/drivers/telescope/celestrongps.cpp b/libindi/drivers/telescope/celestrongps.cpp index e22be0f..67688bf 100644 --- a/libindi/drivers/telescope/celestrongps.cpp +++ b/libindi/drivers/telescope/celestrongps.cpp @@ -1021,6 +1021,12 @@ bool CelestronGPS::Park() bool CelestronGPS::UnPark() { + if (INDI::Telescope::isLocked()) + { + DEBUG(INDI::Logger::DBG_SESSION, "Cannot unpark mount when dome is locking. See: Dome parking policy, in options tab"); + return false; + } + double parkAZ = GetAxis1Park(); double parkAlt = GetAxis2Park(); diff --git a/libindi/drivers/telescope/telescope_simulator.cpp b/libindi/drivers/telescope/telescope_simulator.cpp index 4d65405..e190516 100644 --- a/libindi/drivers/telescope/telescope_simulator.cpp +++ b/libindi/drivers/telescope/telescope_simulator.cpp @@ -626,6 +626,11 @@ bool ScopeSim::Park() bool ScopeSim::UnPark() { + if (INDI::Telescope::isLocked()) + { + DEBUG(INDI::Logger::DBG_SESSION, "Cannot unpark mount when dome is locking. See: Dome parking policy, in options tab"); + return false; + } SetParked(false); return true; } diff --git a/libindi/libs/indibase/indidome.cpp b/libindi/libs/indibase/indidome.cpp index 4a5c67d..4410e15 100644 --- a/libindi/libs/indibase/indidome.cpp +++ b/libindi/libs/indibase/indidome.cpp @@ -22,7 +22,6 @@ #include #include -#include #include "indidome.h" #include "indicom.h" @@ -49,6 +48,7 @@ INDI::Dome::Dome() parkDataType = PARK_NONE; Parkdatafile= "~/.indi/ParkData.xml"; IsParked=false; + IsLocked = true; HaveLatLong=false; HaveRaDec=false; } @@ -86,6 +86,11 @@ bool INDI::Dome::initProperties() IUFillText(&ActiveDeviceT[1],"ACTIVE_WEATHER","Weather","WunderGround"); IUFillTextVector(&ActiveDeviceTP,ActiveDeviceT,2,getDeviceName(),"ACTIVE_DEVICES","Snoop devices",OPTIONS_TAB,IP_RW,60,IPS_IDLE); + // Use locking if telescope is unparked + IUFillSwitch(&TelescopeClosedLockT[0],"NO_ACTION","Ignore Telescope",ISS_ON); + IUFillSwitch(&TelescopeClosedLockT[1],"LOCK_PARKING","Telescope locks",ISS_OFF); + IUFillSwitchVector(&TelescopeClosedLockTP,TelescopeClosedLockT,2,getDeviceName(),"TELESCOPE_POLICY","Telescope parking policy",OPTIONS_TAB,IP_RW,ISR_1OFMANY,60,IPS_IDLE); + // Measurements IUFillNumber(&DomeMeasurementsN[DM_DOME_RADIUS],"DM_DOME_RADIUS","Radius (m)","%6.2f",0.0,50.0,1.0,0.0); IUFillNumber(&DomeMeasurementsN[DM_SHUTTER_WIDTH],"DM_SHUTTER_WIDTH","Shutter width (m)","%6.2f",0.0,10.0,1.0,0.0); @@ -145,7 +150,8 @@ bool INDI::Dome::initProperties() IDSnoopDevice(ActiveDeviceT[0].text,"EQUATORIAL_EOD_COORD"); IDSnoopDevice(ActiveDeviceT[0].text,"GEOGRAPHIC_COORD"); - + IDSnoopDevice(ActiveDeviceT[0].text,"TELESCOPE_PARK"); + IDSnoopDevice(ActiveDeviceT[1].text,"WEATHER_STATUS"); setDriverInterface(DOME_INTERFACE); @@ -162,6 +168,8 @@ void INDI::Dome::ISGetProperties (const char *dev) loadConfig(true, "DEVICE_PORT"); defineText(&ActiveDeviceTP); loadConfig(true, "ACTIVE_DEVICES"); + defineSwitch(&TelescopeClosedLockTP); + loadConfig(true, "TELESCOPE_POLICY"); controller->ISGetProperties(dev); return; @@ -530,6 +538,24 @@ bool INDI::Dome::ISNewSwitch (const char *dev, const char *name, ISState *states return true; } + + // Telescope parking policy + if (!strcmp(name, TelescopeClosedLockTP.name)) + { + if (n == 1) + { + if (!strcmp(names[0], TelescopeClosedLockT[0].name)) + DEBUG(INDI::Logger::DBG_SESSION, "Telescope parking policy set to: Ignore Telescope"); + else if (!strcmp(names[0], TelescopeClosedLockT[1].name)) + DEBUG(INDI::Logger::DBG_SESSION, "Warning: Telescope parking policy set to: Telescope locks. This disallows the dome from parking when telescope is unparked, and can lead to damage to hardware if it rains!"); + } + IUUpdateSwitch(&TelescopeClosedLockTP, states, names, n); + TelescopeClosedLockTP.s = IPS_OK; + IDSetSwitch(&TelescopeClosedLockTP, NULL); + + triggerSnoop(strdup(ActiveDeviceT[0].text), strdup("TELESCOPE_PARK")); + return true; + } } controller->ISNewSwitch(dev, name, states, names, n); @@ -559,6 +585,7 @@ bool INDI::Dome::ISNewText (const char *dev, const char *name, char *texts[], ch IDSnoopDevice(ActiveDeviceT[0].text,"EQUATORIAL_EOD_COORD"); IDSnoopDevice(ActiveDeviceT[0].text,"TARGET_EOD_COORD"); IDSnoopDevice(ActiveDeviceT[0].text,"GEOGRAPHIC_COORD"); + IDSnoopDevice(ActiveDeviceT[0].text,"TELESCOPE_PARK"); IDSnoopDevice(ActiveDeviceT[1].text,"WEATHER_STATUS"); return true; @@ -676,6 +703,28 @@ bool INDI::Dome::ISSnoopDevice (XMLEle *root) return true; } + // Check Telescope Park status + if (!strcmp("TELESCOPE_PARK", propName)) + { + if (!strcmp(findXMLAttValu(root, "state"), "Ok")) + { + bool prevState = IsLocked; + for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0)) + { + const char *elemName = findXMLAttValu(ep, "name"); + + if (IsLocked && !strcmp(elemName, "PARK") && !strcmp(pcdataXMLEle(ep), "On")) + IsLocked = false; + else if (!IsLocked && !strcmp(elemName, "UNPARK") && !strcmp(pcdataXMLEle(ep), "On")) + IsLocked = true; + } + if (prevState != IsLocked && TelescopeClosedLockT[1].s == ISS_ON) + DEBUGF(INDI::Logger::DBG_SESSION, "Telescope status changed. Lock is set to: %s" + , IsLocked ? "locked" : "unlocked"); + } + return true; + } + // Weather Status if (!strcmp("WEATHER_STATUS", propName)) { @@ -708,6 +757,7 @@ bool INDI::Dome::saveConfigItems(FILE *fp) { IUSaveConfigText(fp, &ActiveDeviceTP); IUSaveConfigText(fp, &PortTP); + IUSaveConfigSwitch(fp, &TelescopeClosedLockTP); IUSaveConfigNumber(fp, &PresetNP); IUSaveConfigNumber(fp, &DomeParamNP); IUSaveConfigNumber(fp, &DomeMeasurementsNP); @@ -719,6 +769,17 @@ bool INDI::Dome::saveConfigItems(FILE *fp) return true; } +void INDI::Dome::triggerSnoop(char *driverName, char *snoopedProp) +{ + DEBUGF(INDI::Logger::DBG_DEBUG, "Active Snoop, driver: %s, property: %s", driverName, snoopedProp); + IDSnoopDevice(driverName, snoopedProp); +} + +bool INDI::Dome::isLocked() +{ + return TelescopeClosedLockT[1].s == ISS_ON && IsLocked; +} + void INDI::Dome::buttonHelper(const char *button_n, ISState state, void *context) { static_cast(context)->processButton(button_n, state); diff --git a/libindi/libs/indibase/indidome.h b/libindi/libs/indibase/indidome.h index 3ee4809..237e3a4 100644 --- a/libindi/libs/indibase/indidome.h +++ b/libindi/libs/indibase/indidome.h @@ -23,6 +23,8 @@ #ifndef INDIDOME_H #define INDIDOME_H +#include + #include #include "defaultdevice.h" @@ -189,6 +191,12 @@ class INDI::Dome : public INDI::DefaultDevice */ bool HasVariableSpeed() { return capability & DOME_HAS_VARIABLE_SPEED;} + /** + * @brief isLocked, is the dome currently locked? + * @return True if lock status equals true, and TelescopeClosedLockTP is Telescope Locks. + */ + bool isLocked(); + DomeState getDomeState() const; void setDomeState(const DomeState &value); @@ -446,6 +454,10 @@ protected: ITextVectorProperty ActiveDeviceTP; IText ActiveDeviceT[2]; + // Switch to lock id mount is unparked + ISwitchVectorProperty TelescopeClosedLockTP; + ISwitch TelescopeClosedLockT[2]; + INumber PresetN[3]; INumberVectorProperty PresetNP; ISwitch PresetGotoS[3]; @@ -463,6 +475,8 @@ private: void processButton(const char * button_n, ISState state); + void triggerSnoop(char *driverName, char *propertyName); + INDI::Controller *controller; DomeState domeState; @@ -475,6 +489,7 @@ private: IPState weatherState; bool IsParked; + bool IsLocked; const char *ParkDeviceName; const char * Parkdatafile; XMLEle *ParkdataXmlRoot, *ParkdeviceXml, *ParkstatusXml, *ParkpositionXml, *ParkpositionAxis1Xml; diff --git a/libindi/libs/indibase/inditelescope.cpp b/libindi/libs/indibase/inditelescope.cpp index 2ca4e74..ca69f66 100644 --- a/libindi/libs/indibase/inditelescope.cpp +++ b/libindi/libs/indibase/inditelescope.cpp @@ -30,6 +30,7 @@ INDI::Telescope::Telescope() parkDataType = PARK_NONE; Parkdatafile= "~/.indi/ParkData.xml"; IsParked=false; + IsLocked=true; nSlewRate=0; SlewRateS = NULL; @@ -53,6 +54,17 @@ bool INDI::Telescope::initProperties() IUFillText(&ActiveDeviceT[0],"ACTIVE_GPS","GPS","GPS Simulator"); IUFillTextVector(&ActiveDeviceTP,ActiveDeviceT,1,getDeviceName(),"ACTIVE_DEVICES","Snoop devices",OPTIONS_TAB,IP_RW,60,IPS_IDLE); + // Active Dome + IUFillText(&ActiveDomeT[0],"ACTIVE_DOME","DOME","Dome Simulator"); + IUFillTextVector(&ActiveDomeTP,ActiveDomeT,1,getDeviceName(),"ACTIVE_DOMES","Snoop devices",OPTIONS_TAB,IP_RW,60,IPS_IDLE); + + // Use locking if dome is closed (and or) park scope if dome is closing + IUFillSwitch(&DomeClosedLockT[0],"NO_ACTION","Ignore dome",ISS_ON); + IUFillSwitch(&DomeClosedLockT[1],"LOCK_PARKING","Dome locks",ISS_OFF); + IUFillSwitch(&DomeClosedLockT[2],"FORCE_CLOSE","Dome parks",ISS_OFF); + IUFillSwitch(&DomeClosedLockT[3],"LOCK_AND_FORCE","Both",ISS_OFF); + IUFillSwitchVector(&DomeClosedLockTP,DomeClosedLockT,4,getDeviceName(),"DOME_POLICY","Dome parking policy",OPTIONS_TAB,IP_RW,ISR_1OFMANY,60,IPS_IDLE); + IUFillNumber(&EqN[AXIS_RA],"RA","RA (hh:mm:ss)","%010.6m",0,24,0,0); IUFillNumber(&EqN[AXIS_DE],"DEC","DEC (dd:mm:ss)","%010.6m",-90,90,0,0); IUFillNumberVector(&EqNP,EqN,2,getDeviceName(),"EQUATORIAL_EOD_COORD","Eq. Coordinates",MAIN_CONTROL_TAB,IP_RW,60,IPS_IDLE); @@ -130,6 +142,9 @@ bool INDI::Telescope::initProperties() IDSnoopDevice(ActiveDeviceT[0].text,"GEOGRAPHIC_COORD"); IDSnoopDevice(ActiveDeviceT[0].text,"TIME_UTC"); + IDSnoopDevice(ActiveDomeT[0].text,"DOME_PARK"); + IDSnoopDevice(ActiveDomeT[0].text,"DOME_SHUTTER"); + return true; } @@ -148,6 +163,11 @@ void INDI::Telescope::ISGetProperties (const char *dev) loadConfig(true, "ACTIVE_DEVICES"); } + defineText(&ActiveDomeTP); + loadConfig(true, "ACTIVE_DOMES"); + defineSwitch(&DomeClosedLockTP); + loadConfig(true, "DOME_POLICY"); + if(isConnected()) { // Now we add our telescope specific stuff @@ -316,15 +336,51 @@ bool INDI::Telescope::ISSnoopDevice(XMLEle *root) } return processTimeInfo(utc, offset); + } else if (!strcmp(propName, "DOME_PARK") || !strcmp(propName, "DOME_SHUTTER")) + { + if (strcmp(findXMLAttValu(root, "state"), "Ok")) + { + // Dome options is dome parks or both and dome is parking. + if ((DomeClosedLockT[2].s == ISS_ON || DomeClosedLockT[3].s == ISS_ON) && !IsLocked && !IsParked) + { + Park(); + DEBUG(INDI::Logger::DBG_SESSION, "Dome is closing, parking mount..."); + } + } // Dome is changing state and Dome options is lock or both. d + else if (!strcmp(findXMLAttValu(root, "state"), "Ok")) + { + bool prevState = IsLocked; + for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0)) + { + const char *elemName = findXMLAttValu(ep, "name"); + + if (!IsLocked && (!strcmp(elemName, "PARK")) && !strcmp(pcdataXMLEle(ep), "On")) + IsLocked = true; + else if (IsLocked && (!strcmp(elemName, "UNPARK")) && !strcmp(pcdataXMLEle(ep), "On")) + IsLocked = false; + } + if (prevState != IsLocked && (DomeClosedLockT[1].s == ISS_ON || DomeClosedLockT[3].s == ISS_ON)) + DEBUGF(INDI::Logger::DBG_SESSION, "Dome status changed. Lock is set to: %s" + , IsLocked ? "locked" : "unlock"); + } + return true; } } return INDI::DefaultDevice::ISSnoopDevice(root); } +void INDI::Telescope::triggerSnoop(char *driverName, char *snoopedProp) +{ + DEBUGF(INDI::Logger::DBG_DEBUG, "Active Snoop, driver: %s, property: %s", driverName, snoopedProp); + IDSnoopDevice(driverName, snoopedProp); +} + bool INDI::Telescope::saveConfigItems(FILE *fp) { IUSaveConfigText(fp, &ActiveDeviceTP); + IUSaveConfigText(fp, &ActiveDomeTP); + IUSaveConfigSwitch(fp, &DomeClosedLockTP); IUSaveConfigText(fp, &PortTP); IUSaveConfigSwitch(fp, &BaudRateSP); if (HasLocation()) @@ -436,6 +492,20 @@ bool INDI::Telescope::ISNewText (const char *dev, const char *name, char *texts[ IDSnoopDevice(ActiveDeviceT[0].text,"TIME_UTC"); return true; } + + if(!strcmp(name,ActiveDomeTP.name)) + { + ActiveDomeTP.s=IPS_OK; + IUUpdateText(&ActiveDomeTP,texts,names,n); + // Update client display + IDSetText(&ActiveDomeTP,NULL); + + IDSnoopDevice(ActiveDomeT[0].text,"DOME_PARK"); + IDSnoopDevice(ActiveDomeT[0].text,"DOME_SHUTTER"); + + return true; + } + } controller->ISNewText(dev, name, texts, names, n); @@ -870,6 +940,28 @@ bool INDI::Telescope::ISNewSwitch (const char *dev, const char *name, ISState *s return true; } + // Dome parking policy + if (!strcmp(name, DomeClosedLockTP.name)) + { + if (n == 1) + { + if (!strcmp(names[0], DomeClosedLockT[0].name)) + DEBUG(INDI::Logger::DBG_SESSION, "Dome parking policy set to: Ignore dome"); + else if (!strcmp(names[0], DomeClosedLockT[1].name)) + DEBUG(INDI::Logger::DBG_SESSION, "Warning: Dome parking policy set to: Dome locks. This disallows the scope from unparking when dome is parked"); + else if (!strcmp(names[0], DomeClosedLockT[2].name)) + DEBUG(INDI::Logger::DBG_SESSION, "Warning: Dome parking policy set to: Dome parks. This tells scope to park if dome is parking. This will disable the locking for dome parking, EVEN IF MOUNT PARKING FAILS"); + else if (!strcmp(names[0], DomeClosedLockT[3].name)) + DEBUG(INDI::Logger::DBG_SESSION, "Warning: Dome parking policy set to: Both. This disallows the scope from unparking when dome is parked, and tells scope to park if dome is parking. This will disable the locking for dome parking, EVEN IF MOUNT PARKING FAILS."); + } + IUUpdateSwitch(&DomeClosedLockTP, states, names, n); + DomeClosedLockTP.s = IPS_OK; + IDSetSwitch(&DomeClosedLockTP, NULL); + + triggerSnoop(strdup(ActiveDomeT[0].text), strdup("DOME_PARK")); + return true; + } + } controller->ISNewSwitch(dev, name, states, names, n); @@ -1371,6 +1463,11 @@ void INDI::Telescope::SetAxis2ParkDefault(double value) Axis2DefaultParkPosition=value; } +bool INDI::Telescope::isLocked() +{ + return (DomeClosedLockT[1].s == ISS_ON || DomeClosedLockT[3].s == ISS_ON) && IsLocked; +} + bool INDI::Telescope::SetSlewRate(int index) { INDI_UNUSED(index); diff --git a/libindi/libs/indibase/inditelescope.h b/libindi/libs/indibase/inditelescope.h index 3362e8f..ddedb8c 100644 --- a/libindi/libs/indibase/inditelescope.h +++ b/libindi/libs/indibase/inditelescope.h @@ -19,6 +19,8 @@ #ifndef INDI_TELESCOPE_H #define INDI_TELESCOPE_H +#include + #include #include "defaultdevice.h" @@ -215,6 +217,12 @@ class INDI::Telescope : public INDI::DefaultDevice */ void SetAxis2ParkDefault(double steps); + /** + * @brief isLocked is mount currently locked? + * @return true if lock status equals true and DomeClosedLockTP is Dome Locks or Dome Locks and Dome Parks (both). + */ + bool isLocked(); + // Joystick helpers static void joystickHelper(const char * joystick_n, double mag, double angle, void *context); static void buttonHelper(const char * button_n, ISState state, void *context); @@ -396,10 +404,19 @@ class INDI::Telescope : public INDI::DefaultDevice IText TimeT[2]; ITextVectorProperty TimeTP; - // Active devices to snoop + // Active GPS device to snoop ITextVectorProperty ActiveDeviceTP; IText ActiveDeviceT[1]; + // Active Dome to snoop + ITextVectorProperty ActiveDomeTP; + IText ActiveDomeT[1]; + + // Switch to lock if dome is closed, and or force parking if dome parks + ISwitchVectorProperty DomeClosedLockTP; + ISwitch DomeClosedLockT[4]; + + ISwitch BaudRateS[6]; ISwitchVectorProperty BaudRateSP; @@ -415,7 +432,10 @@ private: bool processTimeInfo(const char *utc, const char *offset); bool processLocationInfo(double latitude, double longitude, double elevation); + void triggerSnoop(char *driverName, char *propertyName); + TelescopeParkData parkDataType; + bool IsLocked; bool IsParked; const char *ParkDeviceName; const char * Parkdatafile;