| 1 | /* | 
|---|
| 2 | LX200 Autostar | 
|---|
| 3 | Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com) | 
|---|
| 4 |  | 
|---|
| 5 | This library is free software; you can redistribute it and/or | 
|---|
| 6 | modify it under the terms of the GNU Lesser General Public | 
|---|
| 7 | License as published by the Free Software Foundation; either | 
|---|
| 8 | version 2.1 of the License, or (at your option) any later version. | 
|---|
| 9 |  | 
|---|
| 10 | This library is distributed in the hope that it will be useful, | 
|---|
| 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|---|
| 13 | Lesser General Public License for more details. | 
|---|
| 14 |  | 
|---|
| 15 | You should have received a copy of the GNU Lesser General Public | 
|---|
| 16 | License along with this library; if not, write to the Free Software | 
|---|
| 17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA | 
|---|
| 18 |  | 
|---|
| 19 | */ | 
|---|
| 20 |  | 
|---|
| 21 | #include "lx200autostar.h" | 
|---|
| 22 | #include "lx200driver.h" | 
|---|
| 23 |  | 
|---|
| 24 | #include <stdio.h> | 
|---|
| 25 | #include <stdlib.h> | 
|---|
| 26 | #include <string.h> | 
|---|
| 27 | #include <unistd.h> | 
|---|
| 28 |  | 
|---|
| 29 | #define BASIC_GROUP   "Main Control" | 
|---|
| 30 | #define FIRMWARE_GROUP "Firmware data" | 
|---|
| 31 | #define FOCUS_GROUP   "Focus Control" | 
|---|
| 32 |  | 
|---|
| 33 |  | 
|---|
| 34 | extern LX200Generic *telescope; | 
|---|
| 35 | extern int MaxReticleFlashRate; | 
|---|
| 36 | extern ITextVectorProperty TimeTP; | 
|---|
| 37 | extern INumberVectorProperty SDTimeNP; | 
|---|
| 38 | extern INumberVectorProperty EquatorialCoordsWNP; | 
|---|
| 39 | extern INumberVectorProperty EquatorialCoordsRNP; | 
|---|
| 40 | extern INumberVectorProperty FocusTimerNP; | 
|---|
| 41 | extern ISwitchVectorProperty ConnectSP; | 
|---|
| 42 | extern ISwitchVectorProperty FocusMotionSP; | 
|---|
| 43 | extern ISwitchVectorProperty AbortSlewSP; | 
|---|
| 44 | extern ISwitchVectorProperty MovementNSSP; | 
|---|
| 45 | extern ISwitchVectorProperty MovementWESP; | 
|---|
| 46 |  | 
|---|
| 47 |  | 
|---|
| 48 | static IText   VersionT[] ={{ "Date", "", 0, 0, 0, 0} , | 
|---|
| 49 | { "Time", "", 0, 0, 0, 0} , | 
|---|
| 50 | { "Number", "", 0, 0, 0 ,0} , | 
|---|
| 51 | { "Full", "", 0, 0, 0, 0} , | 
|---|
| 52 | { "Name", "" ,0 ,0 ,0 ,0}}; | 
|---|
| 53 |  | 
|---|
| 54 | static ITextVectorProperty VersionInfo = {mydev, "Firmware Info", "", FIRMWARE_GROUP, IP_RO, 0, IPS_IDLE, VersionT, NARRAY(VersionT), "" ,0}; | 
|---|
| 55 |  | 
|---|
| 56 | // Focus Control | 
|---|
| 57 | static INumber  FocusSpeedN[]    = {{"SPEED", "Speed", "%0.f", 0.0, 4.0, 1.0, 0.0, 0, 0, 0}}; | 
|---|
| 58 | static INumberVectorProperty    FocusSpeedNP  = {mydev, "FOCUS_SPEED", "Speed", FOCUS_GROUP, IP_RW, 0, IPS_IDLE, FocusSpeedN, NARRAY(FocusSpeedN), "", 0}; | 
|---|
| 59 |  | 
|---|
| 60 | /******************************************** | 
|---|
| 61 | Property: Park telescope to HOME | 
|---|
| 62 | *********************************************/ | 
|---|
| 63 | static ISwitch ParkS[]                  = { {"PARK", "Park", ISS_OFF, 0, 0} }; | 
|---|
| 64 | ISwitchVectorProperty ParkSP            = {mydev, "TELESCOPE_PARK", "Park Scope", BASIC_GROUP, IP_RW, ISR_ATMOST1, 0, IPS_IDLE, ParkS, NARRAY(ParkS), "", 0 }; | 
|---|
| 65 |  | 
|---|
| 66 |  | 
|---|
| 67 | void changeLX200AutostarDeviceName(const char *newName) | 
|---|
| 68 | { | 
|---|
| 69 | strcpy(VersionInfo.device, newName); | 
|---|
| 70 | strcpy(FocusSpeedNP.device, newName); | 
|---|
| 71 | strcpy(ParkSP.device, newName); | 
|---|
| 72 | } | 
|---|
| 73 |  | 
|---|
| 74 | LX200Autostar::LX200Autostar() : LX200Generic() | 
|---|
| 75 | { | 
|---|
| 76 |  | 
|---|
| 77 | } | 
|---|
| 78 |  | 
|---|
| 79 | void LX200Autostar::ISGetProperties (const char *dev) | 
|---|
| 80 | { | 
|---|
| 81 |  | 
|---|
| 82 | if (dev && strcmp (thisDevice, dev)) | 
|---|
| 83 | return; | 
|---|
| 84 |  | 
|---|
| 85 | LX200Generic::ISGetProperties(dev); | 
|---|
| 86 |  | 
|---|
| 87 | IDDefSwitch (&ParkSP, NULL); | 
|---|
| 88 | IDDefText   (&VersionInfo, NULL); | 
|---|
| 89 | IDDefNumber (&FocusSpeedNP, NULL); | 
|---|
| 90 |  | 
|---|
| 91 | // For Autostar, we have a different focus speed method | 
|---|
| 92 | // Therefore, we don't need the classical one | 
|---|
| 93 | IDDelete(thisDevice, "FOCUS_MODE", NULL); | 
|---|
| 94 |  | 
|---|
| 95 | } | 
|---|
| 96 |  | 
|---|
| 97 | void LX200Autostar::ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n) | 
|---|
| 98 | { | 
|---|
| 99 | // ignore if not ours // | 
|---|
| 100 | if (strcmp (dev, thisDevice)) | 
|---|
| 101 | return; | 
|---|
| 102 |  | 
|---|
| 103 | // suppress warning | 
|---|
| 104 | n=n; | 
|---|
| 105 |  | 
|---|
| 106 | LX200Generic::ISNewText (dev, name, texts, names, n); | 
|---|
| 107 |  | 
|---|
| 108 | } | 
|---|
| 109 |  | 
|---|
| 110 |  | 
|---|
| 111 | void LX200Autostar::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n) | 
|---|
| 112 | { | 
|---|
| 113 | // ignore if not ours | 
|---|
| 114 | if (strcmp (dev, thisDevice)) | 
|---|
| 115 | return; | 
|---|
| 116 |  | 
|---|
| 117 | // Focus speed | 
|---|
| 118 | if (!strcmp (name, FocusSpeedNP.name)) | 
|---|
| 119 | { | 
|---|
| 120 | if (checkPower(&FocusSpeedNP)) | 
|---|
| 121 | return; | 
|---|
| 122 |  | 
|---|
| 123 | if (IUUpdateNumber(&FocusSpeedNP, values, names, n) < 0) | 
|---|
| 124 | return; | 
|---|
| 125 |  | 
|---|
| 126 | setGPSFocuserSpeed(fd,  ( (int) FocusSpeedN[0].value)); | 
|---|
| 127 | FocusSpeedNP.s = IPS_OK; | 
|---|
| 128 | IDSetNumber(&FocusSpeedNP, NULL); | 
|---|
| 129 | return; | 
|---|
| 130 | } | 
|---|
| 131 |  | 
|---|
| 132 | LX200Generic::ISNewNumber (dev, name, values, names, n); | 
|---|
| 133 | } | 
|---|
| 134 |  | 
|---|
| 135 | void LX200Autostar::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n) | 
|---|
| 136 | { | 
|---|
| 137 | int index=0, err=0; | 
|---|
| 138 |  | 
|---|
| 139 | if (!strcmp(name, ParkSP.name)) | 
|---|
| 140 | { | 
|---|
| 141 | if (checkPower(&ParkSP)) | 
|---|
| 142 | return; | 
|---|
| 143 |  | 
|---|
| 144 | if (EquatorialCoordsWNP.s == IPS_BUSY) | 
|---|
| 145 | { | 
|---|
| 146 | if (abortSlew(fd) < 0) | 
|---|
| 147 | { | 
|---|
| 148 | AbortSlewSP.s = IPS_ALERT; | 
|---|
| 149 | IDSetSwitch(&AbortSlewSP, NULL); | 
|---|
| 150 | slewError(err); | 
|---|
| 151 | return; | 
|---|
| 152 | } | 
|---|
| 153 |  | 
|---|
| 154 | AbortSlewSP.s = IPS_OK; | 
|---|
| 155 | EquatorialCoordsWNP.s       = IPS_IDLE; | 
|---|
| 156 | IDSetSwitch(&AbortSlewSP, "Slew aborted."); | 
|---|
| 157 | IDSetNumber(&EquatorialCoordsWNP, NULL); | 
|---|
| 158 |  | 
|---|
| 159 | if (MovementNSSP.s == IPS_BUSY || MovementWESP.s == IPS_BUSY) | 
|---|
| 160 | { | 
|---|
| 161 | MovementNSSP.s  = MovementWESP.s =  IPS_IDLE; | 
|---|
| 162 | EquatorialCoordsWNP.s       = IPS_IDLE; | 
|---|
| 163 | IUResetSwitch(&MovementNSSP); | 
|---|
| 164 | IUResetSwitch(&MovementWESP); | 
|---|
| 165 | IUResetSwitch(&AbortSlewSP); | 
|---|
| 166 |  | 
|---|
| 167 | IDSetSwitch(&MovementNSSP, NULL); | 
|---|
| 168 | IDSetSwitch(&MovementWESP, NULL); | 
|---|
| 169 | } | 
|---|
| 170 |  | 
|---|
| 171 | // sleep for 200 mseconds | 
|---|
| 172 | usleep(200000); | 
|---|
| 173 | } | 
|---|
| 174 |  | 
|---|
| 175 | if (slewToPark(fd) < 0) | 
|---|
| 176 | { | 
|---|
| 177 | ParkSP.s = IPS_ALERT; | 
|---|
| 178 | IDSetSwitch(&ParkSP, "Parking Failed."); | 
|---|
| 179 | return; | 
|---|
| 180 | } | 
|---|
| 181 |  | 
|---|
| 182 | ParkSP.s = IPS_OK; | 
|---|
| 183 | ConnectSP.s   = IPS_IDLE; | 
|---|
| 184 | ConnectSP.sp[0].s = ISS_OFF; | 
|---|
| 185 | ConnectSP.sp[1].s = ISS_ON; | 
|---|
| 186 | tty_disconnect(fd); | 
|---|
| 187 | IDSetSwitch(&ParkSP, "The telescope is slewing to park position. Turn off the telescope after park is complete. Disconnecting..."); | 
|---|
| 188 | IDSetSwitch(&ConnectSP, NULL); | 
|---|
| 189 | return; | 
|---|
| 190 | } | 
|---|
| 191 |  | 
|---|
| 192 | // Focus Motion | 
|---|
| 193 | if (!strcmp (name, FocusMotionSP.name)) | 
|---|
| 194 | { | 
|---|
| 195 | if (checkPower(&FocusMotionSP)) | 
|---|
| 196 | return; | 
|---|
| 197 |  | 
|---|
| 198 | IUResetSwitch(&FocusMotionSP); | 
|---|
| 199 |  | 
|---|
| 200 | // If speed is "halt" | 
|---|
| 201 | if (FocusSpeedN[0].value == 0) | 
|---|
| 202 | { | 
|---|
| 203 | FocusMotionSP.s = IPS_IDLE; | 
|---|
| 204 | IDSetSwitch(&FocusMotionSP, NULL); | 
|---|
| 205 | return; | 
|---|
| 206 | } | 
|---|
| 207 |  | 
|---|
| 208 | IUUpdateSwitch(&FocusMotionSP, states, names, n); | 
|---|
| 209 | index = getOnSwitch(&FocusMotionSP); | 
|---|
| 210 |  | 
|---|
| 211 |  | 
|---|
| 212 | if ( ( err = setFocuserMotion(fd, index) < 0) ) | 
|---|
| 213 | { | 
|---|
| 214 | handleError(&FocusMotionSP, err, "Setting focuser speed"); | 
|---|
| 215 | return; | 
|---|
| 216 | } | 
|---|
| 217 |  | 
|---|
| 218 | FocusMotionSP.s = IPS_BUSY; | 
|---|
| 219 |  | 
|---|
| 220 | // with a timer | 
|---|
| 221 | if (FocusTimerNP.np[0].value > 0) | 
|---|
| 222 | { | 
|---|
| 223 | FocusTimerNP.s  = IPS_BUSY; | 
|---|
| 224 | IDLog("Starting Focus Timer BUSY\n"); | 
|---|
| 225 | IEAddTimer(50, LX200Generic::updateFocusTimer, this); | 
|---|
| 226 | } | 
|---|
| 227 |  | 
|---|
| 228 | IDSetSwitch(&FocusMotionSP, NULL); | 
|---|
| 229 | return; | 
|---|
| 230 | } | 
|---|
| 231 |  | 
|---|
| 232 | LX200Generic::ISNewSwitch (dev, name, states, names,  n); | 
|---|
| 233 |  | 
|---|
| 234 | } | 
|---|
| 235 |  | 
|---|
| 236 | void LX200Autostar::ISPoll () | 
|---|
| 237 | { | 
|---|
| 238 |  | 
|---|
| 239 | LX200Generic::ISPoll(); | 
|---|
| 240 |  | 
|---|
| 241 | } | 
|---|
| 242 |  | 
|---|
| 243 | void LX200Autostar::getBasicData() | 
|---|
| 244 | { | 
|---|
| 245 |  | 
|---|
| 246 | VersionInfo.tp[0].text = new char[64]; | 
|---|
| 247 | getVersionDate(fd, VersionInfo.tp[0].text); | 
|---|
| 248 | VersionInfo.tp[1].text = new char[64]; | 
|---|
| 249 | getVersionTime(fd, VersionInfo.tp[1].text); | 
|---|
| 250 | VersionInfo.tp[2].text = new char[64]; | 
|---|
| 251 | getVersionNumber(fd, VersionInfo.tp[2].text); | 
|---|
| 252 | VersionInfo.tp[3].text = new char[128]; | 
|---|
| 253 | getFullVersion(fd, VersionInfo.tp[3].text); | 
|---|
| 254 | VersionInfo.tp[4].text = new char[128]; | 
|---|
| 255 | getProductName(fd, VersionInfo.tp[4].text); | 
|---|
| 256 |  | 
|---|
| 257 | IDSetText(&VersionInfo, NULL); | 
|---|
| 258 |  | 
|---|
| 259 | // process parent | 
|---|
| 260 | LX200Generic::getBasicData(); | 
|---|
| 261 |  | 
|---|
| 262 | } | 
|---|