Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyuan9642
Date:
Sun Aug 19 05:21:20 2018 +0000
Revision:
0:6cb2eaf8b133
Child:
2:2ee28add0821
v0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caoyuan9642 0:6cb2eaf8b133 1 #ifndef EQUATORIALMOUNT_H_
caoyuan9642 0:6cb2eaf8b133 2 #define EQUATORIALMOUNT_H_
caoyuan9642 0:6cb2eaf8b133 3
caoyuan9642 0:6cb2eaf8b133 4 class EquatorialMount;
caoyuan9642 0:6cb2eaf8b133 5
caoyuan9642 0:6cb2eaf8b133 6 #include "Axis.h"
caoyuan9642 0:6cb2eaf8b133 7 #include "Mount.h"
caoyuan9642 0:6cb2eaf8b133 8 #include "UTCClock.h"
caoyuan9642 0:6cb2eaf8b133 9 #include "LocationProvider.h"
caoyuan9642 0:6cb2eaf8b133 10 #include "CelestialMath.h"
caoyuan9642 0:6cb2eaf8b133 11
caoyuan9642 0:6cb2eaf8b133 12 #define MAX_AS_N 10 // Max number of alignment stars
caoyuan9642 0:6cb2eaf8b133 13
caoyuan9642 0:6cb2eaf8b133 14 /**
caoyuan9642 0:6cb2eaf8b133 15 * Direction of nudge
caoyuan9642 0:6cb2eaf8b133 16 */
caoyuan9642 0:6cb2eaf8b133 17 typedef enum
caoyuan9642 0:6cb2eaf8b133 18 {
caoyuan9642 0:6cb2eaf8b133 19 NUDGE_NONE = 0,
caoyuan9642 0:6cb2eaf8b133 20 NUDGE_EAST = 1,
caoyuan9642 0:6cb2eaf8b133 21 NUDGE_WEST = 2,
caoyuan9642 0:6cb2eaf8b133 22 NUDGE_NORTH = 4,
caoyuan9642 0:6cb2eaf8b133 23 NUDGE_SOUTH = 8,
caoyuan9642 0:6cb2eaf8b133 24
caoyuan9642 0:6cb2eaf8b133 25 NUDGE_NORTHWEST = NUDGE_NORTH | NUDGE_WEST,
caoyuan9642 0:6cb2eaf8b133 26 NUDGE_SOUTHWEST = NUDGE_SOUTH | NUDGE_WEST,
caoyuan9642 0:6cb2eaf8b133 27 NUDGE_NORTHEAST = NUDGE_NORTH | NUDGE_EAST,
caoyuan9642 0:6cb2eaf8b133 28 NUDGE_SOUTHEAST = NUDGE_SOUTH | NUDGE_EAST,
caoyuan9642 0:6cb2eaf8b133 29 } nudgedir_t;
caoyuan9642 0:6cb2eaf8b133 30
caoyuan9642 0:6cb2eaf8b133 31 /**
caoyuan9642 0:6cb2eaf8b133 32 * Direction of guide
caoyuan9642 0:6cb2eaf8b133 33 */
caoyuan9642 0:6cb2eaf8b133 34 typedef enum
caoyuan9642 0:6cb2eaf8b133 35 {
caoyuan9642 0:6cb2eaf8b133 36 GUIDE_EAST = 1, GUIDE_WEST = 2, GUIDE_NORTH = 3, GUIDE_SOUTH = 4,
caoyuan9642 0:6cb2eaf8b133 37 } guidedir_t;
caoyuan9642 0:6cb2eaf8b133 38
caoyuan9642 0:6cb2eaf8b133 39 /**
caoyuan9642 0:6cb2eaf8b133 40 * Object that represents an equatorial mount with two perpendicular axis called RA and Dec.
caoyuan9642 0:6cb2eaf8b133 41 */
caoyuan9642 0:6cb2eaf8b133 42 class EquatorialMount: public Mount
caoyuan9642 0:6cb2eaf8b133 43 {
caoyuan9642 0:6cb2eaf8b133 44
caoyuan9642 0:6cb2eaf8b133 45 protected:
caoyuan9642 0:6cb2eaf8b133 46 Axis &ra; /// RA Axis
caoyuan9642 0:6cb2eaf8b133 47 Axis &dec; /// DEC Axis
caoyuan9642 0:6cb2eaf8b133 48
caoyuan9642 0:6cb2eaf8b133 49 UTCClock &clock; /// Clock
caoyuan9642 0:6cb2eaf8b133 50
caoyuan9642 0:6cb2eaf8b133 51 Mutex mutex_update; /// Mutex to lock position updating
caoyuan9642 0:6cb2eaf8b133 52 Mutex mutex_execution; /// Mutex to lock motion related functions
caoyuan9642 0:6cb2eaf8b133 53
caoyuan9642 0:6cb2eaf8b133 54 LocationCoordinates location; /// Current location (GPS coordinates)
caoyuan9642 0:6cb2eaf8b133 55 bool south; /// If we are in south semisphere
caoyuan9642 0:6cb2eaf8b133 56 MountCoordinates curr_pos; /// Current Position in mount coordinates (offset from the index positions)
caoyuan9642 0:6cb2eaf8b133 57 EquatorialCoordinates curr_pos_eq; /// Current Position in the equatorial coordinates (absolute pointing direction in the sky)
caoyuan9642 0:6cb2eaf8b133 58 nudgedir_t curr_nudge_dir;
caoyuan9642 0:6cb2eaf8b133 59 double nudgeSpeed;
caoyuan9642 0:6cb2eaf8b133 60
caoyuan9642 0:6cb2eaf8b133 61 pierside_t pier_side; /// Side of pier. 1: East
caoyuan9642 0:6cb2eaf8b133 62 EqCalibration calibration;
caoyuan9642 0:6cb2eaf8b133 63 AlignmentStar alignment_stars[MAX_AS_N];
caoyuan9642 0:6cb2eaf8b133 64 int num_alignment_stars;
caoyuan9642 0:6cb2eaf8b133 65
caoyuan9642 0:6cb2eaf8b133 66 public:
caoyuan9642 0:6cb2eaf8b133 67
caoyuan9642 0:6cb2eaf8b133 68 /**
caoyuan9642 0:6cb2eaf8b133 69 * Create an EquatorialMount object which controls two axis
caoyuan9642 0:6cb2eaf8b133 70 * @param ra RA Axis
caoyuan9642 0:6cb2eaf8b133 71 * @param dec DEC Axis
caoyuan9642 0:6cb2eaf8b133 72 * @note cone_value, ma_alt, ma_azi,off_ra, off_dec will be init to zero, i.e. assuming a perfectly aligned mount pointing at RA=DEC=0
caoyuan9642 0:6cb2eaf8b133 73 * @note This class assumes that the rotating direction of both axis are correct.
caoyuan9642 0:6cb2eaf8b133 74 * This should be done using the invert option when initializing the RotationAxis objects
caoyuan9642 0:6cb2eaf8b133 75 * @sa RotationAxis
caoyuan9642 0:6cb2eaf8b133 76 */
caoyuan9642 0:6cb2eaf8b133 77 EquatorialMount(Axis &ra, Axis &dec, UTCClock &clk,
caoyuan9642 0:6cb2eaf8b133 78 LocationCoordinates loc);
caoyuan9642 0:6cb2eaf8b133 79 virtual ~EquatorialMount()
caoyuan9642 0:6cb2eaf8b133 80 {
caoyuan9642 0:6cb2eaf8b133 81 }
caoyuan9642 0:6cb2eaf8b133 82
caoyuan9642 0:6cb2eaf8b133 83 /**
caoyuan9642 0:6cb2eaf8b133 84 * Perform a Go-To to specified equatorial coordinates in the sky
caoyuan9642 0:6cb2eaf8b133 85 * @param ra_dest RA coordinate in degree.
caoyuan9642 0:6cb2eaf8b133 86 * @return osOK if no error
caoyuan9642 0:6cb2eaf8b133 87 */
caoyuan9642 0:6cb2eaf8b133 88 osStatus goTo(double ra_dest, double dec_dest);
caoyuan9642 0:6cb2eaf8b133 89 osStatus goTo(EquatorialCoordinates dest);
caoyuan9642 0:6cb2eaf8b133 90 osStatus goToMount(MountCoordinates mc, bool withCorrection = true);
caoyuan9642 0:6cb2eaf8b133 91 osStatus goToIndex()
caoyuan9642 0:6cb2eaf8b133 92 {
caoyuan9642 0:6cb2eaf8b133 93 return goToMount(MountCoordinates(0, 0));
caoyuan9642 0:6cb2eaf8b133 94 }
caoyuan9642 0:6cb2eaf8b133 95
caoyuan9642 0:6cb2eaf8b133 96 osStatus startNudge(nudgedir_t);
caoyuan9642 0:6cb2eaf8b133 97 osStatus stopNudge();
caoyuan9642 0:6cb2eaf8b133 98
caoyuan9642 0:6cb2eaf8b133 99 osStatus startTracking();
caoyuan9642 0:6cb2eaf8b133 100 osStatus stopTracking();
caoyuan9642 0:6cb2eaf8b133 101
caoyuan9642 0:6cb2eaf8b133 102 /**
caoyuan9642 0:6cb2eaf8b133 103 * Guide on specified direction for specified time
caoyuan9642 0:6cb2eaf8b133 104 */
caoyuan9642 0:6cb2eaf8b133 105 osStatus guide(guidedir_t dir, int ms);
caoyuan9642 0:6cb2eaf8b133 106
caoyuan9642 0:6cb2eaf8b133 107 /*Calibration related functions*/
caoyuan9642 0:6cb2eaf8b133 108 /**
caoyuan9642 0:6cb2eaf8b133 109 * Clear calibration, use current latitude for the polar axis
caoyuan9642 0:6cb2eaf8b133 110 */
caoyuan9642 0:6cb2eaf8b133 111 void clearCalibration()
caoyuan9642 0:6cb2eaf8b133 112 {
caoyuan9642 0:6cb2eaf8b133 113 num_alignment_stars = 0;
caoyuan9642 0:6cb2eaf8b133 114 calibration = EqCalibration();
caoyuan9642 0:6cb2eaf8b133 115 calibration.pa.alt = location.lat;
caoyuan9642 0:6cb2eaf8b133 116 }
caoyuan9642 0:6cb2eaf8b133 117
caoyuan9642 0:6cb2eaf8b133 118 const EqCalibration &getCalibration() const
caoyuan9642 0:6cb2eaf8b133 119 {
caoyuan9642 0:6cb2eaf8b133 120 return calibration;
caoyuan9642 0:6cb2eaf8b133 121 }
caoyuan9642 0:6cb2eaf8b133 122
caoyuan9642 0:6cb2eaf8b133 123 int getNumAlignmentStar()
caoyuan9642 0:6cb2eaf8b133 124 {
caoyuan9642 0:6cb2eaf8b133 125 return num_alignment_stars;
caoyuan9642 0:6cb2eaf8b133 126 }
caoyuan9642 0:6cb2eaf8b133 127
caoyuan9642 0:6cb2eaf8b133 128 osStatus addAlignmentStar(AlignmentStar as)
caoyuan9642 0:6cb2eaf8b133 129 {
caoyuan9642 0:6cb2eaf8b133 130 if (num_alignment_stars < MAX_AS_N)
caoyuan9642 0:6cb2eaf8b133 131 {
caoyuan9642 0:6cb2eaf8b133 132 alignment_stars[num_alignment_stars++] = as;
caoyuan9642 0:6cb2eaf8b133 133 return recalibrate();
caoyuan9642 0:6cb2eaf8b133 134 }
caoyuan9642 0:6cb2eaf8b133 135 else
caoyuan9642 0:6cb2eaf8b133 136 return osErrorResource;
caoyuan9642 0:6cb2eaf8b133 137 }
caoyuan9642 0:6cb2eaf8b133 138
caoyuan9642 0:6cb2eaf8b133 139 osStatus removeAlignmentStar(int index)
caoyuan9642 0:6cb2eaf8b133 140 {
caoyuan9642 0:6cb2eaf8b133 141 if (index < 0 || index >= num_alignment_stars)
caoyuan9642 0:6cb2eaf8b133 142 {
caoyuan9642 0:6cb2eaf8b133 143 return osErrorParameter;
caoyuan9642 0:6cb2eaf8b133 144 }
caoyuan9642 0:6cb2eaf8b133 145 for (; index < num_alignment_stars - 1; index++)
caoyuan9642 0:6cb2eaf8b133 146 {
caoyuan9642 0:6cb2eaf8b133 147 alignment_stars[index] = alignment_stars[index + 1];
caoyuan9642 0:6cb2eaf8b133 148 }
caoyuan9642 0:6cb2eaf8b133 149 num_alignment_stars--;
caoyuan9642 0:6cb2eaf8b133 150 return recalibrate();
caoyuan9642 0:6cb2eaf8b133 151 }
caoyuan9642 0:6cb2eaf8b133 152
caoyuan9642 0:6cb2eaf8b133 153 AlignmentStar *getAlignmentStar(int index)
caoyuan9642 0:6cb2eaf8b133 154 {
caoyuan9642 0:6cb2eaf8b133 155 if (index < 0 || index >= num_alignment_stars)
caoyuan9642 0:6cb2eaf8b133 156 {
caoyuan9642 0:6cb2eaf8b133 157 return NULL;
caoyuan9642 0:6cb2eaf8b133 158 }
caoyuan9642 0:6cb2eaf8b133 159 return &alignment_stars[index];
caoyuan9642 0:6cb2eaf8b133 160 }
caoyuan9642 0:6cb2eaf8b133 161
caoyuan9642 0:6cb2eaf8b133 162 osStatus replaceAlignmentStar(int index, AlignmentStar as)
caoyuan9642 0:6cb2eaf8b133 163 {
caoyuan9642 0:6cb2eaf8b133 164 if (index < 0 || index >= num_alignment_stars)
caoyuan9642 0:6cb2eaf8b133 165 {
caoyuan9642 0:6cb2eaf8b133 166 return osErrorParameter;
caoyuan9642 0:6cb2eaf8b133 167 }
caoyuan9642 0:6cb2eaf8b133 168 alignment_stars[index] = as;
caoyuan9642 0:6cb2eaf8b133 169 return recalibrate();
caoyuan9642 0:6cb2eaf8b133 170 }
caoyuan9642 0:6cb2eaf8b133 171
caoyuan9642 0:6cb2eaf8b133 172 /*Utility functions to convert between coordinate systems*/
caoyuan9642 0:6cb2eaf8b133 173 MountCoordinates convertToMountCoordinates(const EquatorialCoordinates &eq)
caoyuan9642 0:6cb2eaf8b133 174 {
caoyuan9642 0:6cb2eaf8b133 175 LocalEquatorialCoordinates leq =
caoyuan9642 0:6cb2eaf8b133 176 CelestialMath::equatorialToLocalEquatorial(eq, clock.getTime(),
caoyuan9642 0:6cb2eaf8b133 177 location);
caoyuan9642 0:6cb2eaf8b133 178 // Apply PA misalignment
caoyuan9642 0:6cb2eaf8b133 179 leq = CelestialMath::applyMisalignment(leq, calibration.pa, location);
caoyuan9642 0:6cb2eaf8b133 180 // Apply Cone error
caoyuan9642 0:6cb2eaf8b133 181 leq = CelestialMath::applyConeError(leq, calibration.cone);
caoyuan9642 0:6cb2eaf8b133 182 // Convert to Mount coordinates. Automatically determine the pier side, then apply offset
caoyuan9642 0:6cb2eaf8b133 183 return CelestialMath::localEquatorialToMount(leq, PIER_SIDE_AUTO)
caoyuan9642 0:6cb2eaf8b133 184 + calibration.offset;
caoyuan9642 0:6cb2eaf8b133 185 }
caoyuan9642 0:6cb2eaf8b133 186
caoyuan9642 0:6cb2eaf8b133 187 EquatorialCoordinates convertToEqCoordinates(const MountCoordinates &mc)
caoyuan9642 0:6cb2eaf8b133 188 {
caoyuan9642 0:6cb2eaf8b133 189 LocalEquatorialCoordinates leq = CelestialMath::mountToLocalEquatorial(
caoyuan9642 0:6cb2eaf8b133 190 mc - calibration.offset);
caoyuan9642 0:6cb2eaf8b133 191 leq = CelestialMath::deapplyConeError(leq, calibration.cone);
caoyuan9642 0:6cb2eaf8b133 192 leq = CelestialMath::deapplyMisalignment(leq, calibration.pa, location);
caoyuan9642 0:6cb2eaf8b133 193 return CelestialMath::localEquatorialToEquatorial(leq, clock.getTime(),
caoyuan9642 0:6cb2eaf8b133 194 location);
caoyuan9642 0:6cb2eaf8b133 195 }
caoyuan9642 0:6cb2eaf8b133 196
caoyuan9642 0:6cb2eaf8b133 197 osStatus recalibrate();
caoyuan9642 0:6cb2eaf8b133 198
caoyuan9642 0:6cb2eaf8b133 199 /**
caoyuan9642 0:6cb2eaf8b133 200 * Call emergency stop of the Axis objects
caoyuan9642 0:6cb2eaf8b133 201 * @note This function can be called from any context (including ISR) to perform a hard stop of the mount
caoyuan9642 0:6cb2eaf8b133 202 */
caoyuan9642 0:6cb2eaf8b133 203 void emergencyStop();
caoyuan9642 0:6cb2eaf8b133 204
caoyuan9642 0:6cb2eaf8b133 205 /**
caoyuan9642 0:6cb2eaf8b133 206 * Call stop of the Axis objects
caoyuan9642 0:6cb2eaf8b133 207 * @note This function can be called from any context (including ISR) to perform a soft stop of the mount
caoyuan9642 0:6cb2eaf8b133 208 */
caoyuan9642 0:6cb2eaf8b133 209 void stopAsync();
caoyuan9642 0:6cb2eaf8b133 210
caoyuan9642 0:6cb2eaf8b133 211 /** BLOCKING. Cannot be called in ISR.
caoyuan9642 0:6cb2eaf8b133 212 * Call stop of the Axis objects and wait until they are stopped.
caoyuan9642 0:6cb2eaf8b133 213 * @note This function can be called from any context (including ISR) to perform a soft stop of the mount
caoyuan9642 0:6cb2eaf8b133 214 */
caoyuan9642 0:6cb2eaf8b133 215 void stopSync();
caoyuan9642 0:6cb2eaf8b133 216
caoyuan9642 0:6cb2eaf8b133 217 /**
caoyuan9642 0:6cb2eaf8b133 218 * Get current equatorial coordinates
caoyuan9642 0:6cb2eaf8b133 219 * @return current equatorial coordinates
caoyuan9642 0:6cb2eaf8b133 220 */
caoyuan9642 0:6cb2eaf8b133 221 const EquatorialCoordinates &getEquatorialCoordinates()
caoyuan9642 0:6cb2eaf8b133 222 {
caoyuan9642 0:6cb2eaf8b133 223 updatePosition();
caoyuan9642 0:6cb2eaf8b133 224 return curr_pos_eq;
caoyuan9642 0:6cb2eaf8b133 225 }
caoyuan9642 0:6cb2eaf8b133 226
caoyuan9642 0:6cb2eaf8b133 227 /**
caoyuan9642 0:6cb2eaf8b133 228 * Get current mount coordinates
caoyuan9642 0:6cb2eaf8b133 229 * @return current mount coordinates
caoyuan9642 0:6cb2eaf8b133 230 */
caoyuan9642 0:6cb2eaf8b133 231 const MountCoordinates &getMountCoordinates()
caoyuan9642 0:6cb2eaf8b133 232 {
caoyuan9642 0:6cb2eaf8b133 233 updatePosition();
caoyuan9642 0:6cb2eaf8b133 234 return curr_pos;
caoyuan9642 0:6cb2eaf8b133 235 }
caoyuan9642 0:6cb2eaf8b133 236
caoyuan9642 0:6cb2eaf8b133 237 /**
caoyuan9642 0:6cb2eaf8b133 238 * Make an alignment star object using the provided reference star, current mount position, and current time
caoyuan9642 0:6cb2eaf8b133 239 * @param star_ref Reference star position
caoyuan9642 0:6cb2eaf8b133 240 * @return AlignmentStar object representing the alignment star
caoyuan9642 0:6cb2eaf8b133 241 */
caoyuan9642 0:6cb2eaf8b133 242 AlignmentStar makeAlignmentStar(const EquatorialCoordinates star_ref)
caoyuan9642 0:6cb2eaf8b133 243 {
caoyuan9642 0:6cb2eaf8b133 244 updatePosition();
caoyuan9642 0:6cb2eaf8b133 245 return AlignmentStar(star_ref, curr_pos, clock.getTime());
caoyuan9642 0:6cb2eaf8b133 246 }
caoyuan9642 0:6cb2eaf8b133 247
caoyuan9642 0:6cb2eaf8b133 248 /**
caoyuan9642 0:6cb2eaf8b133 249 * Align the current mount using an array of alignment stars. Support up to 10 stars.
caoyuan9642 0:6cb2eaf8b133 250 * @note If n=1, will only correct for Index offset
caoyuan9642 0:6cb2eaf8b133 251 * If n=2, will correct for index offset and polar misalignment
caoyuan9642 0:6cb2eaf8b133 252 * If n>=3, will correct for index offset, pa misalignment and cone error
caoyuan9642 0:6cb2eaf8b133 253 * @param n # of alignment stars to use
caoyuan9642 0:6cb2eaf8b133 254 * @param as Array of alignment stars
caoyuan9642 0:6cb2eaf8b133 255 * @return osOK if successfully converged and updated the values
caoyuan9642 0:6cb2eaf8b133 256 */
caoyuan9642 0:6cb2eaf8b133 257 osStatus align(int n, const AlignmentStar as[]);
caoyuan9642 0:6cb2eaf8b133 258
caoyuan9642 0:6cb2eaf8b133 259 /**
caoyuan9642 0:6cb2eaf8b133 260 * Set slew rate of both axis
caoyuan9642 0:6cb2eaf8b133 261 * @param rate new speed
caoyuan9642 0:6cb2eaf8b133 262 */
caoyuan9642 0:6cb2eaf8b133 263 void setSlewSpeed(double rate);
caoyuan9642 0:6cb2eaf8b133 264 double getSlewSpeed();
caoyuan9642 0:6cb2eaf8b133 265
caoyuan9642 0:6cb2eaf8b133 266 /**
caoyuan9642 0:6cb2eaf8b133 267 * Set tracking speed of RA axis
caoyuan9642 0:6cb2eaf8b133 268 * @param rate new speed in sidereal rate
caoyuan9642 0:6cb2eaf8b133 269 */
caoyuan9642 0:6cb2eaf8b133 270 void setTrackSpeedSidereal(double rate);
caoyuan9642 0:6cb2eaf8b133 271 double getTrackSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 272
caoyuan9642 0:6cb2eaf8b133 273 /**
caoyuan9642 0:6cb2eaf8b133 274 * Set guiding speed of RA axis
caoyuan9642 0:6cb2eaf8b133 275 * @param rate new speed in sidereal rate
caoyuan9642 0:6cb2eaf8b133 276 */
caoyuan9642 0:6cb2eaf8b133 277 void setGuideSpeedSidereal(double rate);
caoyuan9642 0:6cb2eaf8b133 278 double getGuideSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 279
caoyuan9642 0:6cb2eaf8b133 280 /**
caoyuan9642 0:6cb2eaf8b133 281 * Print current position to STDOUT. Should call updatePosition to update the current position
caoyuan9642 0:6cb2eaf8b133 282 */
caoyuan9642 0:6cb2eaf8b133 283 void printPosition(FILE *stream = stdout)
caoyuan9642 0:6cb2eaf8b133 284 {
caoyuan9642 0:6cb2eaf8b133 285 fprintf(stream, "Mount: RA=%7.2f, DEC=%7.2f %c\n", curr_pos.ra_delta,
caoyuan9642 0:6cb2eaf8b133 286 curr_pos.dec_delta,
caoyuan9642 0:6cb2eaf8b133 287 (curr_pos.side == PIER_SIDE_WEST) ? 'W' : 'E');
caoyuan9642 0:6cb2eaf8b133 288 fprintf(stream, "EQ: RA=%7.2f, DEC=%7.2f\n", curr_pos_eq.ra,
caoyuan9642 0:6cb2eaf8b133 289 curr_pos_eq.dec);
caoyuan9642 0:6cb2eaf8b133 290 }
caoyuan9642 0:6cb2eaf8b133 291
caoyuan9642 0:6cb2eaf8b133 292 void updatePosition();
caoyuan9642 0:6cb2eaf8b133 293
caoyuan9642 0:6cb2eaf8b133 294 UTCClock& getClock() const
caoyuan9642 0:6cb2eaf8b133 295 {
caoyuan9642 0:6cb2eaf8b133 296 return clock;
caoyuan9642 0:6cb2eaf8b133 297 }
caoyuan9642 0:6cb2eaf8b133 298
caoyuan9642 0:6cb2eaf8b133 299 const LocationCoordinates& getLocation() const
caoyuan9642 0:6cb2eaf8b133 300 {
caoyuan9642 0:6cb2eaf8b133 301 return location;
caoyuan9642 0:6cb2eaf8b133 302 }
caoyuan9642 0:6cb2eaf8b133 303
caoyuan9642 0:6cb2eaf8b133 304 };
caoyuan9642 0:6cb2eaf8b133 305
caoyuan9642 0:6cb2eaf8b133 306 #endif /*EQUATORIALMOUNT_H_*/
caoyuan9642 0:6cb2eaf8b133 307