Telescope Control Library

Dependents:   PushToGo-F429

Committer:
caoyuan9642
Date:
Mon Aug 27 23:24:00 2018 +0000
Revision:
4:b8ad57bbf9e1
Parent:
2:2ee28add0821
Child:
9:d0413a9b1386
Fixed bugs and added polar alignment functions

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 2:2ee28add0821 102 mountstatus_t getStatus();
caoyuan9642 0:6cb2eaf8b133 103 /**
caoyuan9642 0:6cb2eaf8b133 104 * Guide on specified direction for specified time
caoyuan9642 0:6cb2eaf8b133 105 */
caoyuan9642 0:6cb2eaf8b133 106 osStatus guide(guidedir_t dir, int ms);
caoyuan9642 0:6cb2eaf8b133 107
caoyuan9642 0:6cb2eaf8b133 108 /*Calibration related functions*/
caoyuan9642 4:b8ad57bbf9e1 109
caoyuan9642 0:6cb2eaf8b133 110 /**
caoyuan9642 0:6cb2eaf8b133 111 * Clear calibration, use current latitude for the polar axis
caoyuan9642 0:6cb2eaf8b133 112 */
caoyuan9642 0:6cb2eaf8b133 113 void clearCalibration()
caoyuan9642 0:6cb2eaf8b133 114 {
caoyuan9642 0:6cb2eaf8b133 115 num_alignment_stars = 0;
caoyuan9642 0:6cb2eaf8b133 116 calibration = EqCalibration();
caoyuan9642 0:6cb2eaf8b133 117 calibration.pa.alt = location.lat;
caoyuan9642 0:6cb2eaf8b133 118 }
caoyuan9642 4:b8ad57bbf9e1 119
caoyuan9642 4:b8ad57bbf9e1 120 /**
caoyuan9642 4:b8ad57bbf9e1 121 * Clear calibration except axis offsets, use current latitude for the polar axis
caoyuan9642 4:b8ad57bbf9e1 122 */
caoyuan9642 4:b8ad57bbf9e1 123 void clearCalibrationExceptOffsets()
caoyuan9642 4:b8ad57bbf9e1 124 {
caoyuan9642 4:b8ad57bbf9e1 125 num_alignment_stars = 0;
caoyuan9642 4:b8ad57bbf9e1 126 calibration.cone = 0;
caoyuan9642 4:b8ad57bbf9e1 127 calibration.pa.alt = location.lat;
caoyuan9642 4:b8ad57bbf9e1 128 calibration.pa.azi = 0;
caoyuan9642 4:b8ad57bbf9e1 129 }
caoyuan9642 0:6cb2eaf8b133 130
caoyuan9642 4:b8ad57bbf9e1 131 /**
caoyuan9642 4:b8ad57bbf9e1 132 * Get calibration
caoyuan9642 4:b8ad57bbf9e1 133 * @return Current calibration
caoyuan9642 4:b8ad57bbf9e1 134 */
caoyuan9642 0:6cb2eaf8b133 135 const EqCalibration &getCalibration() const
caoyuan9642 0:6cb2eaf8b133 136 {
caoyuan9642 0:6cb2eaf8b133 137 return calibration;
caoyuan9642 0:6cb2eaf8b133 138 }
caoyuan9642 4:b8ad57bbf9e1 139
caoyuan9642 4:b8ad57bbf9e1 140 /**
caoyuan9642 4:b8ad57bbf9e1 141 * Set calibration
caoyuan9642 4:b8ad57bbf9e1 142 * @param calib New Calibration
caoyuan9642 4:b8ad57bbf9e1 143 */
caoyuan9642 4:b8ad57bbf9e1 144 void setCalibration(const EqCalibration &calib){
caoyuan9642 4:b8ad57bbf9e1 145 calibration = calib;
caoyuan9642 4:b8ad57bbf9e1 146 }
caoyuan9642 0:6cb2eaf8b133 147
caoyuan9642 4:b8ad57bbf9e1 148 /** @return number of alignment stars
caoyuan9642 4:b8ad57bbf9e1 149 */
caoyuan9642 0:6cb2eaf8b133 150 int getNumAlignmentStar()
caoyuan9642 0:6cb2eaf8b133 151 {
caoyuan9642 0:6cb2eaf8b133 152 return num_alignment_stars;
caoyuan9642 0:6cb2eaf8b133 153 }
caoyuan9642 0:6cb2eaf8b133 154
caoyuan9642 4:b8ad57bbf9e1 155 /** Add an alignment star
caoyuan9642 4:b8ad57bbf9e1 156 * @return osStatus error if no more star can be added
caoyuan9642 4:b8ad57bbf9e1 157 */
caoyuan9642 4:b8ad57bbf9e1 158 osStatus addAlignmentStar(const AlignmentStar &as)
caoyuan9642 0:6cb2eaf8b133 159 {
caoyuan9642 0:6cb2eaf8b133 160 if (num_alignment_stars < MAX_AS_N)
caoyuan9642 0:6cb2eaf8b133 161 {
caoyuan9642 0:6cb2eaf8b133 162 alignment_stars[num_alignment_stars++] = as;
caoyuan9642 0:6cb2eaf8b133 163 return recalibrate();
caoyuan9642 0:6cb2eaf8b133 164 }
caoyuan9642 0:6cb2eaf8b133 165 else
caoyuan9642 0:6cb2eaf8b133 166 return osErrorResource;
caoyuan9642 0:6cb2eaf8b133 167 }
caoyuan9642 0:6cb2eaf8b133 168
caoyuan9642 4:b8ad57bbf9e1 169 /** Remove an alignment star
caoyuan9642 4:b8ad57bbf9e1 170 * @param index # of star to remove, starting from 0
caoyuan9642 4:b8ad57bbf9e1 171 * @return osStatus error if no more star can be deleted
caoyuan9642 4:b8ad57bbf9e1 172 */
caoyuan9642 0:6cb2eaf8b133 173 osStatus removeAlignmentStar(int index)
caoyuan9642 0:6cb2eaf8b133 174 {
caoyuan9642 0:6cb2eaf8b133 175 if (index < 0 || index >= num_alignment_stars)
caoyuan9642 0:6cb2eaf8b133 176 {
caoyuan9642 0:6cb2eaf8b133 177 return osErrorParameter;
caoyuan9642 0:6cb2eaf8b133 178 }
caoyuan9642 0:6cb2eaf8b133 179 for (; index < num_alignment_stars - 1; index++)
caoyuan9642 0:6cb2eaf8b133 180 {
caoyuan9642 0:6cb2eaf8b133 181 alignment_stars[index] = alignment_stars[index + 1];
caoyuan9642 0:6cb2eaf8b133 182 }
caoyuan9642 0:6cb2eaf8b133 183 num_alignment_stars--;
caoyuan9642 0:6cb2eaf8b133 184 return recalibrate();
caoyuan9642 0:6cb2eaf8b133 185 }
caoyuan9642 0:6cb2eaf8b133 186
caoyuan9642 4:b8ad57bbf9e1 187 /** Get alignment star
caoyuan9642 4:b8ad57bbf9e1 188 * @param index # of star to get
caoyuan9642 4:b8ad57bbf9e1 189 * @return pointer to that alignment star if found, NULL if doesn't exist
caoyuan9642 4:b8ad57bbf9e1 190 */
caoyuan9642 0:6cb2eaf8b133 191 AlignmentStar *getAlignmentStar(int index)
caoyuan9642 0:6cb2eaf8b133 192 {
caoyuan9642 0:6cb2eaf8b133 193 if (index < 0 || index >= num_alignment_stars)
caoyuan9642 0:6cb2eaf8b133 194 {
caoyuan9642 0:6cb2eaf8b133 195 return NULL;
caoyuan9642 0:6cb2eaf8b133 196 }
caoyuan9642 0:6cb2eaf8b133 197 return &alignment_stars[index];
caoyuan9642 0:6cb2eaf8b133 198 }
caoyuan9642 0:6cb2eaf8b133 199
caoyuan9642 4:b8ad57bbf9e1 200 /** Replace an alignment star with another
caoyuan9642 4:b8ad57bbf9e1 201 * @param index # of star to replace
caoyuan9642 4:b8ad57bbf9e1 202 * @param as new star to add. Will be copied by value
caoyuan9642 4:b8ad57bbf9e1 203 * @return error if star not found
caoyuan9642 4:b8ad57bbf9e1 204 */
caoyuan9642 4:b8ad57bbf9e1 205 osStatus replaceAlignmentStar(int index, const AlignmentStar &as)
caoyuan9642 0:6cb2eaf8b133 206 {
caoyuan9642 0:6cb2eaf8b133 207 if (index < 0 || index >= num_alignment_stars)
caoyuan9642 0:6cb2eaf8b133 208 {
caoyuan9642 0:6cb2eaf8b133 209 return osErrorParameter;
caoyuan9642 0:6cb2eaf8b133 210 }
caoyuan9642 0:6cb2eaf8b133 211 alignment_stars[index] = as;
caoyuan9642 0:6cb2eaf8b133 212 return recalibrate();
caoyuan9642 0:6cb2eaf8b133 213 }
caoyuan9642 4:b8ad57bbf9e1 214
caoyuan9642 4:b8ad57bbf9e1 215 /** Force all alignment stars to be perfected aligned according to the current calibration
caoyuan9642 4:b8ad57bbf9e1 216 * Useful during a polar alignment procedure
caoyuan9642 4:b8ad57bbf9e1 217 * @note This will throw off all the alignment stars if the error is too big or calibration is wrong
caoyuan9642 4:b8ad57bbf9e1 218 */
caoyuan9642 4:b8ad57bbf9e1 219 void forceAlignment();
caoyuan9642 0:6cb2eaf8b133 220
caoyuan9642 4:b8ad57bbf9e1 221 /**
caoyuan9642 4:b8ad57bbf9e1 222 * Convert EQ coordinates to mount coodinates using current calibration. Utility function
caoyuan9642 4:b8ad57bbf9e1 223 * @param eq EQ coordinate to convert
caoyuan9642 4:b8ad57bbf9e1 224 * @return mount coordinates
caoyuan9642 4:b8ad57bbf9e1 225 */
caoyuan9642 0:6cb2eaf8b133 226 MountCoordinates convertToMountCoordinates(const EquatorialCoordinates &eq)
caoyuan9642 0:6cb2eaf8b133 227 {
caoyuan9642 0:6cb2eaf8b133 228 LocalEquatorialCoordinates leq =
caoyuan9642 0:6cb2eaf8b133 229 CelestialMath::equatorialToLocalEquatorial(eq, clock.getTime(),
caoyuan9642 0:6cb2eaf8b133 230 location);
caoyuan9642 0:6cb2eaf8b133 231 // Apply PA misalignment
caoyuan9642 0:6cb2eaf8b133 232 leq = CelestialMath::applyMisalignment(leq, calibration.pa, location);
caoyuan9642 0:6cb2eaf8b133 233 // Apply Cone error
caoyuan9642 0:6cb2eaf8b133 234 leq = CelestialMath::applyConeError(leq, calibration.cone);
caoyuan9642 0:6cb2eaf8b133 235 // Convert to Mount coordinates. Automatically determine the pier side, then apply offset
caoyuan9642 0:6cb2eaf8b133 236 return CelestialMath::localEquatorialToMount(leq, PIER_SIDE_AUTO)
caoyuan9642 0:6cb2eaf8b133 237 + calibration.offset;
caoyuan9642 0:6cb2eaf8b133 238 }
caoyuan9642 0:6cb2eaf8b133 239
caoyuan9642 4:b8ad57bbf9e1 240 /**
caoyuan9642 4:b8ad57bbf9e1 241 * Convert mount coordinates to EQ coodinates using current calibration. Utility function
caoyuan9642 4:b8ad57bbf9e1 242 * @param mc Mount coordinate to convert
caoyuan9642 4:b8ad57bbf9e1 243 * @return EQ coordinates
caoyuan9642 4:b8ad57bbf9e1 244 */
caoyuan9642 0:6cb2eaf8b133 245 EquatorialCoordinates convertToEqCoordinates(const MountCoordinates &mc)
caoyuan9642 0:6cb2eaf8b133 246 {
caoyuan9642 0:6cb2eaf8b133 247 LocalEquatorialCoordinates leq = CelestialMath::mountToLocalEquatorial(
caoyuan9642 0:6cb2eaf8b133 248 mc - calibration.offset);
caoyuan9642 0:6cb2eaf8b133 249 leq = CelestialMath::deapplyConeError(leq, calibration.cone);
caoyuan9642 0:6cb2eaf8b133 250 leq = CelestialMath::deapplyMisalignment(leq, calibration.pa, location);
caoyuan9642 0:6cb2eaf8b133 251 return CelestialMath::localEquatorialToEquatorial(leq, clock.getTime(),
caoyuan9642 0:6cb2eaf8b133 252 location);
caoyuan9642 0:6cb2eaf8b133 253 }
caoyuan9642 0:6cb2eaf8b133 254
caoyuan9642 4:b8ad57bbf9e1 255
caoyuan9642 4:b8ad57bbf9e1 256 /**
caoyuan9642 4:b8ad57bbf9e1 257 * Use alignment stars to recalculate the calibration.
caoyuan9642 4:b8ad57bbf9e1 258 * @return osStatus
caoyuan9642 4:b8ad57bbf9e1 259 */
caoyuan9642 0:6cb2eaf8b133 260 osStatus recalibrate();
caoyuan9642 0:6cb2eaf8b133 261
caoyuan9642 0:6cb2eaf8b133 262 /**
caoyuan9642 0:6cb2eaf8b133 263 * Call emergency stop of the Axis objects
caoyuan9642 0:6cb2eaf8b133 264 * @note This function can be called from any context (including ISR) to perform a hard stop of the mount
caoyuan9642 0:6cb2eaf8b133 265 */
caoyuan9642 0:6cb2eaf8b133 266 void emergencyStop();
caoyuan9642 0:6cb2eaf8b133 267
caoyuan9642 0:6cb2eaf8b133 268 /**
caoyuan9642 0:6cb2eaf8b133 269 * Call stop of the Axis objects
caoyuan9642 0:6cb2eaf8b133 270 * @note This function can be called from any context (including ISR) to perform a soft stop of the mount
caoyuan9642 0:6cb2eaf8b133 271 */
caoyuan9642 0:6cb2eaf8b133 272 void stopAsync();
caoyuan9642 0:6cb2eaf8b133 273
caoyuan9642 0:6cb2eaf8b133 274 /** BLOCKING. Cannot be called in ISR.
caoyuan9642 0:6cb2eaf8b133 275 * Call stop of the Axis objects and wait until they are stopped.
caoyuan9642 0:6cb2eaf8b133 276 * @note This function can be called from any context (including ISR) to perform a soft stop of the mount
caoyuan9642 0:6cb2eaf8b133 277 */
caoyuan9642 0:6cb2eaf8b133 278 void stopSync();
caoyuan9642 0:6cb2eaf8b133 279
caoyuan9642 0:6cb2eaf8b133 280 /**
caoyuan9642 0:6cb2eaf8b133 281 * Get current equatorial coordinates
caoyuan9642 0:6cb2eaf8b133 282 * @return current equatorial coordinates
caoyuan9642 0:6cb2eaf8b133 283 */
caoyuan9642 0:6cb2eaf8b133 284 const EquatorialCoordinates &getEquatorialCoordinates()
caoyuan9642 0:6cb2eaf8b133 285 {
caoyuan9642 0:6cb2eaf8b133 286 updatePosition();
caoyuan9642 0:6cb2eaf8b133 287 return curr_pos_eq;
caoyuan9642 0:6cb2eaf8b133 288 }
caoyuan9642 0:6cb2eaf8b133 289
caoyuan9642 0:6cb2eaf8b133 290 /**
caoyuan9642 0:6cb2eaf8b133 291 * Get current mount coordinates
caoyuan9642 0:6cb2eaf8b133 292 * @return current mount coordinates
caoyuan9642 0:6cb2eaf8b133 293 */
caoyuan9642 0:6cb2eaf8b133 294 const MountCoordinates &getMountCoordinates()
caoyuan9642 0:6cb2eaf8b133 295 {
caoyuan9642 0:6cb2eaf8b133 296 updatePosition();
caoyuan9642 0:6cb2eaf8b133 297 return curr_pos;
caoyuan9642 0:6cb2eaf8b133 298 }
caoyuan9642 0:6cb2eaf8b133 299
caoyuan9642 0:6cb2eaf8b133 300 /**
caoyuan9642 0:6cb2eaf8b133 301 * Make an alignment star object using the provided reference star, current mount position, and current time
caoyuan9642 0:6cb2eaf8b133 302 * @param star_ref Reference star position
caoyuan9642 0:6cb2eaf8b133 303 * @return AlignmentStar object representing the alignment star
caoyuan9642 0:6cb2eaf8b133 304 */
caoyuan9642 0:6cb2eaf8b133 305 AlignmentStar makeAlignmentStar(const EquatorialCoordinates star_ref)
caoyuan9642 0:6cb2eaf8b133 306 {
caoyuan9642 0:6cb2eaf8b133 307 updatePosition();
caoyuan9642 0:6cb2eaf8b133 308 return AlignmentStar(star_ref, curr_pos, clock.getTime());
caoyuan9642 0:6cb2eaf8b133 309 }
caoyuan9642 0:6cb2eaf8b133 310
caoyuan9642 0:6cb2eaf8b133 311 /**
caoyuan9642 0:6cb2eaf8b133 312 * Align the current mount using an array of alignment stars. Support up to 10 stars.
caoyuan9642 0:6cb2eaf8b133 313 * @note If n=1, will only correct for Index offset
caoyuan9642 0:6cb2eaf8b133 314 * If n=2, will correct for index offset and polar misalignment
caoyuan9642 0:6cb2eaf8b133 315 * If n>=3, will correct for index offset, pa misalignment and cone error
caoyuan9642 0:6cb2eaf8b133 316 * @param n # of alignment stars to use
caoyuan9642 0:6cb2eaf8b133 317 * @param as Array of alignment stars
caoyuan9642 0:6cb2eaf8b133 318 * @return osOK if successfully converged and updated the values
caoyuan9642 0:6cb2eaf8b133 319 */
caoyuan9642 0:6cb2eaf8b133 320 osStatus align(int n, const AlignmentStar as[]);
caoyuan9642 0:6cb2eaf8b133 321
caoyuan9642 0:6cb2eaf8b133 322 /**
caoyuan9642 0:6cb2eaf8b133 323 * Set slew rate of both axis
caoyuan9642 0:6cb2eaf8b133 324 * @param rate new speed
caoyuan9642 0:6cb2eaf8b133 325 */
caoyuan9642 0:6cb2eaf8b133 326 void setSlewSpeed(double rate);
caoyuan9642 4:b8ad57bbf9e1 327
caoyuan9642 4:b8ad57bbf9e1 328 /** @return current slew speed
caoyuan9642 4:b8ad57bbf9e1 329 */
caoyuan9642 0:6cb2eaf8b133 330 double getSlewSpeed();
caoyuan9642 0:6cb2eaf8b133 331
caoyuan9642 0:6cb2eaf8b133 332 /**
caoyuan9642 0:6cb2eaf8b133 333 * Set tracking speed of RA axis
caoyuan9642 0:6cb2eaf8b133 334 * @param rate new speed in sidereal rate
caoyuan9642 0:6cb2eaf8b133 335 */
caoyuan9642 0:6cb2eaf8b133 336 void setTrackSpeedSidereal(double rate);
caoyuan9642 4:b8ad57bbf9e1 337
caoyuan9642 4:b8ad57bbf9e1 338 /** @return current track speed in sidereal units
caoyuan9642 4:b8ad57bbf9e1 339 */
caoyuan9642 0:6cb2eaf8b133 340 double getTrackSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 341
caoyuan9642 0:6cb2eaf8b133 342 /**
caoyuan9642 0:6cb2eaf8b133 343 * Set guiding speed of RA axis
caoyuan9642 0:6cb2eaf8b133 344 * @param rate new speed in sidereal rate
caoyuan9642 0:6cb2eaf8b133 345 */
caoyuan9642 0:6cb2eaf8b133 346 void setGuideSpeedSidereal(double rate);
caoyuan9642 4:b8ad57bbf9e1 347
caoyuan9642 4:b8ad57bbf9e1 348 /** @return current guide speed in sidereal units
caoyuan9642 4:b8ad57bbf9e1 349 */
caoyuan9642 0:6cb2eaf8b133 350 double getGuideSpeedSidereal();
caoyuan9642 0:6cb2eaf8b133 351
caoyuan9642 0:6cb2eaf8b133 352 /**
caoyuan9642 4:b8ad57bbf9e1 353 * Print current position to stream.
caoyuan9642 0:6cb2eaf8b133 354 */
caoyuan9642 0:6cb2eaf8b133 355 void printPosition(FILE *stream = stdout)
caoyuan9642 0:6cb2eaf8b133 356 {
caoyuan9642 0:6cb2eaf8b133 357 fprintf(stream, "Mount: RA=%7.2f, DEC=%7.2f %c\n", curr_pos.ra_delta,
caoyuan9642 0:6cb2eaf8b133 358 curr_pos.dec_delta,
caoyuan9642 0:6cb2eaf8b133 359 (curr_pos.side == PIER_SIDE_WEST) ? 'W' : 'E');
caoyuan9642 0:6cb2eaf8b133 360 fprintf(stream, "EQ: RA=%7.2f, DEC=%7.2f\n", curr_pos_eq.ra,
caoyuan9642 0:6cb2eaf8b133 361 curr_pos_eq.dec);
caoyuan9642 0:6cb2eaf8b133 362 }
caoyuan9642 0:6cb2eaf8b133 363
caoyuan9642 4:b8ad57bbf9e1 364 /**
caoyuan9642 4:b8ad57bbf9e1 365 * Update current pointing direction from low-level encoders/counters.
caoyuan9642 4:b8ad57bbf9e1 366 * @note should be called before printing the position using printPosition
caoyuan9642 4:b8ad57bbf9e1 367 */
caoyuan9642 0:6cb2eaf8b133 368 void updatePosition();
caoyuan9642 0:6cb2eaf8b133 369
caoyuan9642 4:b8ad57bbf9e1 370 /** Get current time source
caoyuan9642 4:b8ad57bbf9e1 371 */
caoyuan9642 0:6cb2eaf8b133 372 UTCClock& getClock() const
caoyuan9642 0:6cb2eaf8b133 373 {
caoyuan9642 0:6cb2eaf8b133 374 return clock;
caoyuan9642 0:6cb2eaf8b133 375 }
caoyuan9642 0:6cb2eaf8b133 376
caoyuan9642 4:b8ad57bbf9e1 377 /** @return get current location coodinates.
caoyuan9642 4:b8ad57bbf9e1 378 */
caoyuan9642 0:6cb2eaf8b133 379 const LocationCoordinates& getLocation() const
caoyuan9642 0:6cb2eaf8b133 380 {
caoyuan9642 0:6cb2eaf8b133 381 return location;
caoyuan9642 0:6cb2eaf8b133 382 }
caoyuan9642 4:b8ad57bbf9e1 383
caoyuan9642 0:6cb2eaf8b133 384 };
caoyuan9642 0:6cb2eaf8b133 385
caoyuan9642 0:6cb2eaf8b133 386 #endif /*EQUATORIALMOUNT_H_*/
caoyuan9642 0:6cb2eaf8b133 387