| 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 | }
|
|---|