Telescope Control Library
EquatorialMount.h@4:b8ad57bbf9e1, 2018-08-27 (annotated)
- 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?
User | Revision | Line number | New 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 |