1 /******************************************************************************* 2 Copyright(c) 2015 Jasem Mutlaq. All rights reserved. 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Library General Public 6 License version 2 as published by the Free Software Foundation. 7 . 8 This library is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 Library General Public License for more details. 12 . 13 You should have received a copy of the GNU Library General Public License 14 along with this library; see the file COPYING.LIB. If not, write to 15 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 16 Boston, MA 02110-1301, USA. 17 *******************************************************************************/ 18 19 #pragma once 20 21 #include "indiguiderinterface.h" 22 #include "inditelescope.h" 23 #include "scopesim_helper.h" 24 25 #define USE_SIM_TAB 26 27 /** 28 * @brief The ScopeSim class provides a simple mount simulator of an equatorial mount. 29 * 30 * It supports the following features: 31 * + Sideral and Custom Tracking rates. 32 * + Goto & Sync 33 * + NWSE Hand controller direciton key slew. 34 * + Tracking On/Off. 35 * + Parking & Unparking with custom parking positions. 36 * + Setting Time & Location. 37 * 38 * On startup and by default the mount shall point to the celestial pole. 39 * 40 * @author Jasem Mutlaq 41 */ 42 class ScopeSim : public INDI::Telescope, public INDI::GuiderInterface 43 { 44 public: 45 ScopeSim(); 46 virtual ~ScopeSim() = default; 47 48 virtual const char *getDefaultName() override; 49 virtual bool Connect() override; 50 virtual bool Disconnect() override; 51 virtual bool ReadScopeStatus() override; 52 virtual bool initProperties() override; 53 virtual void ISGetProperties(const char *dev) override; 54 virtual bool updateProperties() override; 55 56 virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override; 57 virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override; 58 59 protected: 60 // Slew Rate 61 virtual bool MoveNS(INDI_DIR_NS dir, TelescopeMotionCommand command) override; 62 virtual bool MoveWE(INDI_DIR_WE dir, TelescopeMotionCommand command) override; 63 virtual bool Abort() override; 64 65 virtual IPState GuideNorth(uint32_t ms) override; 66 virtual IPState GuideSouth(uint32_t ms) override; 67 virtual IPState GuideEast(uint32_t ms) override; 68 virtual IPState GuideWest(uint32_t ms) override; 69 70 virtual bool SetTrackMode(uint8_t mode) override; 71 virtual bool SetTrackEnabled(bool enabled) override; 72 virtual bool SetTrackRate(double raRate, double deRate) override; 73 74 virtual bool Goto(double, double) override; 75 virtual bool Park() override; 76 virtual bool UnPark() override; 77 virtual bool Sync(double ra, double dec) override; 78 79 // Parking 80 virtual bool SetCurrentPark() override; 81 virtual bool SetDefaultPark() override; 82 virtual bool updateLocation(double latitude, double longitude, double elevation) override; 83 84 virtual bool saveConfigItems(FILE *fp) override; 85 86 private: 87 double currentRA { 0 }; 88 double currentDEC { 90 }; 89 double targetRA { 0 }; 90 double targetDEC { 0 }; 91 92 /// used by GoTo and Park 93 void StartSlew(double ra, double dec, TelescopeStatus status); 94 95 // bool forceMeridianFlip { false }; // #PS: unused 96 unsigned int DBG_SCOPE { 0 }; 97 98 int mcRate = 0; 99 100 // double guiderEWTarget[2]; 101 // double guiderNSTarget[2]; 102 103 bool guidingNS = false; 104 bool guidingEW = false; 105 106 INumber GuideRateN[2]; 107 INumberVectorProperty GuideRateNP; 108 109 Axis axisPrimary { "HaAxis" }; // hour angle mount axis 110 Axis axisSecondary { "DecAxis" }; // declination mount axis 111 112 int m_PierSide {-1}; 113 int m_MountType {-1}; 114 115 Alignment alignment; 116 bool updateMountAndPierSide(); 117 118 #ifdef USE_SIM_TAB 119 // Simulator Tab properties 120 // Scope type and alignment 121 ISwitch mountTypeS[3]; 122 ISwitchVectorProperty mountTypeSP; 123 ISwitch simPierSideS[2]; 124 ISwitchVectorProperty simPierSideSP; 125 126 INumber mountModelN[6]; 127 INumberVectorProperty mountModelNP; 128 INumber mountAxisN[2]; 129 INumberVectorProperty mountAxisNP; 130 131 INumber flipHourAngleN[1]; 132 INumberVectorProperty flipHourAngleNP; 133 #endif 134 135 }; 136 137