summaryrefslogtreecommitdiffstats
path: root/kstars/kstars/indi/lx200classic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kstars/kstars/indi/lx200classic.cpp')
-rw-r--r--kstars/kstars/indi/lx200classic.cpp333
1 files changed, 333 insertions, 0 deletions
diff --git a/kstars/kstars/indi/lx200classic.cpp b/kstars/kstars/indi/lx200classic.cpp
new file mode 100644
index 00000000..5788bd16
--- /dev/null
+++ b/kstars/kstars/indi/lx200classic.cpp
@@ -0,0 +1,333 @@
+/*
+ LX200 Classoc
+ Copyright (C) 2003 Jasem Mutlaq (mutlaqja@ikarustech.com)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lx200classic.h"
+#include "lx200driver.h"
+
+extern LX200Generic *telescope;
+extern INumberVectorProperty eqNum;
+extern ITextVectorProperty Time;
+extern int MaxReticleFlashRate;
+
+#define BASIC_GROUP "Main Control"
+#define LIBRARY_GROUP "Library"
+#define MOVE_GROUP "Movement Control"
+
+static IText ObjectText[] = {{"objectText", "Info", 0, 0, 0, 0}};
+static ITextVectorProperty ObjectInfo = {mydev, "Object Info", "", BASIC_GROUP, IP_RO, 0, IPS_IDLE, ObjectText, NARRAY(ObjectText), "", 0};
+
+/* Library group */
+static ISwitch StarCatalogS[] = {{"STAR", "", ISS_ON, 0, 0}, {"SAO", "", ISS_OFF, 0, 0}, {"GCVS", "", ISS_OFF, 0, 0}};
+static ISwitch DeepSkyCatalogS[] = {{"NGC", "", ISS_ON, 0, 0}, {"IC", "", ISS_OFF, 0, 0}, {"UGC", "", ISS_OFF, 0, 0}, {"Caldwell", "", ISS_OFF, 0, 0}, {"Arp", "", ISS_OFF, 0, 0}, {"Abell", "", ISS_OFF, 0, 0}, {"Messier", "", ISS_OFF, 0, 0}};
+static ISwitch SolarS[] = { {"Select", "Select item...", ISS_ON, 0, 0}, {"1", "Mercury", ISS_OFF,0 , 0}, {"2", "Venus", ISS_OFF, 0, 0}, {"3", "Moon", ISS_OFF, 0, 0}, {"4", "Mars", ISS_OFF, 0, 0}, {"5", "Jupiter", ISS_OFF, 0, 0}, {"6", "Saturn", ISS_OFF, 0, 0}, {"7", "Uranus", ISS_OFF, 0, 0}, {"8", "Neptune", ISS_OFF, 0, 0}, {"9", "Pluto", ISS_OFF, 0 ,0}};
+
+static ISwitchVectorProperty StarCatalogSw = { mydev, "Star Catalogs", "", LIBRARY_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, StarCatalogS, NARRAY(StarCatalogS), "", 0};
+static ISwitchVectorProperty DeepSkyCatalogSw= { mydev, "Deep Sky Catalogs", "", LIBRARY_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, DeepSkyCatalogS, NARRAY(DeepSkyCatalogS), "", 0};
+static ISwitchVectorProperty SolarSw = { mydev, "SOLAR_SYSTEM", "Solar System", LIBRARY_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, SolarS, NARRAY(SolarS), "", 0};
+
+static INumber ObjectN[] = { "ObjectN", "Number", "%g", 1., 10000., 1., 0., 0, 0, 0};
+static INumberVectorProperty ObjectNo= { mydev, "Object Number", "", LIBRARY_GROUP, IP_RW, 0, IPS_IDLE, ObjectN, NARRAY(ObjectN), "", 0 };
+
+static INumber MaxSlew[] = {{"maxSlew", "Rate", "%g", 2.0, 9.0, 1.0, 9., 0, 0 ,0}};
+static INumberVectorProperty MaxSlewRate = { mydev, "Max slew Rate", "", MOVE_GROUP, IP_RW, 0, IPS_IDLE, MaxSlew, NARRAY(MaxSlew), "", 0};
+
+static INumber altLimit[] = {
+ {"minAlt", "min Alt", "%+03f", -90., 90., 0., 0., 0, 0, 0},
+ {"maxAlt", "max Alt", "%+03f", -90., 90., 0., 0., 0, 0, 0}};
+static INumberVectorProperty elevationLimit = { mydev, "altLimit", "Slew elevation Limit", BASIC_GROUP, IP_RW, 0, IPS_IDLE, altLimit, NARRAY(altLimit), "", 0};
+
+void changeLX200ClassicDeviceName(const char *newName)
+{
+ strcpy(ObjectInfo.device, newName);
+ strcpy(SolarSw.device, newName);
+ strcpy(StarCatalogSw.device, newName);
+ strcpy(DeepSkyCatalogSw.device, newName);
+ strcpy(ObjectNo.device, newName);
+ strcpy(MaxSlewRate.device , newName );
+ strcpy(elevationLimit.device , newName );
+}
+
+LX200Classic::LX200Classic() : LX200Generic()
+{
+ ObjectInfo.tp[0].text = new char[128];
+ strcpy(ObjectInfo.tp[0].text, "");
+
+ currentCatalog = LX200_STAR_C;
+ currentSubCatalog = 0;
+
+}
+
+
+void LX200Classic::ISGetProperties (const char *dev)
+{
+
+if (dev && strcmp (thisDevice, dev))
+ return;
+
+ LX200Generic::ISGetProperties(dev);
+
+ IDDefNumber (&elevationLimit, NULL);
+ IDDefText (&ObjectInfo, NULL);
+ IDDefSwitch (&SolarSw, NULL);
+ IDDefSwitch (&StarCatalogSw, NULL);
+ IDDefSwitch (&DeepSkyCatalogSw, NULL);
+ IDDefNumber (&ObjectNo, NULL);
+ IDDefNumber (&MaxSlewRate, NULL);
+
+}
+
+void LX200Classic::ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n)
+{
+ // ignore if not ours //
+ if (strcmp (dev, thisDevice))
+ return;
+
+ LX200Generic::ISNewText (dev, name, texts, names, n);
+}
+
+
+void LX200Classic::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
+{
+ int err=0;
+
+ // ignore if not ours //
+ if (strcmp (dev, thisDevice))
+ return;
+
+ if ( !strcmp (name, ObjectNo.name) )
+ {
+ if (checkPower(&ObjectNo))
+ return;
+
+ selectCatalogObject( currentCatalog, (int) values[0]);
+
+ getLX200RA(&eqNum.np[0].value);
+ getLX200DEC(&eqNum.np[1].value);
+
+ ObjectNo.s = eqNum.s = IPS_OK;
+ IDSetNumber(&ObjectNo , "Object updated");
+ IDSetNumber(&eqNum, NULL);
+
+ if (getObjectInfo(ObjectText[0].text) < 0)
+ IDMessage(thisDevice, "Getting object info failed.");
+ else
+ IDSetText (&ObjectInfo, NULL);
+
+ handleCoordSet();
+
+ return;
+ }
+
+ if ( !strcmp (name, MaxSlewRate.name) )
+ {
+
+ if (checkPower(&MaxSlewRate))
+ return;
+
+ if ( ( err = setMaxSlewRate( (int) values[0]) < 0) )
+ {
+ handleError(&MaxSlewRate, err, "Setting maximum slew rate");
+ return;
+ }
+ MaxSlewRate.s = IPS_OK;
+ MaxSlewRate.np[0].value = values[0];
+ IDSetNumber(&MaxSlewRate, NULL);
+ return;
+ }
+
+
+
+ if (!strcmp (name, elevationLimit.name))
+ {
+ // new elevation limits
+ double minAlt = 0, maxAlt = 0;
+ int i, nset;
+
+ if (checkPower(&elevationLimit))
+ return;
+
+ for (nset = i = 0; i < n; i++)
+ {
+ INumber *altp = IUFindNumber (&elevationLimit, names[i]);
+ if (altp == &altLimit[0])
+ {
+ minAlt = values[i];
+ nset += minAlt >= -90.0 && minAlt <= 90.0;
+ } else if (altp == &altLimit[1])
+ {
+ maxAlt = values[i];
+ nset += maxAlt >= -90.0 && maxAlt <= 90.0;
+ }
+ }
+ if (nset == 2)
+ {
+ //char l[32], L[32];
+ if ( ( err = setMinElevationLimit( (int) minAlt) < 0) )
+ {
+ handleError(&elevationLimit, err, "Setting elevation limit");
+ }
+ setMaxElevationLimit( (int) maxAlt);
+ elevationLimit.np[0].value = minAlt;
+ elevationLimit.np[1].value = maxAlt;
+ elevationLimit.s = IPS_OK;
+ IDSetNumber (&elevationLimit, NULL);
+ } else
+ {
+ elevationLimit.s = IPS_IDLE;
+ IDSetNumber(&elevationLimit, "elevation limit missing or invalid");
+ }
+
+ return;
+ }
+
+ LX200Generic::ISNewNumber (dev, name, values, names, n);
+}
+
+ void LX200Classic::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
+ {
+
+ int index=0;
+
+ // ignore if not ours //
+ if (strcmp (dev, thisDevice))
+ return;
+
+ // Star Catalog
+ if (!strcmp (name, StarCatalogSw.name))
+ {
+ if (checkPower(&StarCatalogSw))
+ return;
+
+ IUResetSwitches(&StarCatalogSw);
+ IUUpdateSwitches(&StarCatalogSw, states, names, n);
+ index = getOnSwitch(&StarCatalogSw);
+
+ currentCatalog = LX200_STAR_C;
+
+ if (selectSubCatalog(currentCatalog, index))
+ {
+ currentSubCatalog = index;
+ StarCatalogSw.s = IPS_OK;
+ IDSetSwitch(&StarCatalogSw, NULL);
+ }
+ else
+ {
+ StarCatalogSw.s = IPS_IDLE;
+ IDSetSwitch(&StarCatalogSw, "Catalog unavailable");
+ }
+ return;
+ }
+
+ // Deep sky catalog
+ if (!strcmp (name, DeepSkyCatalogSw.name))
+ {
+ if (checkPower(&DeepSkyCatalogSw))
+ return;
+
+ IUResetSwitches(&DeepSkyCatalogSw);
+ IUUpdateSwitches(&DeepSkyCatalogSw, states, names, n);
+ index = getOnSwitch(&DeepSkyCatalogSw);
+
+ if (index == LX200_MESSIER_C)
+ {
+ currentCatalog = index;
+ DeepSkyCatalogSw.s = IPS_OK;
+ IDSetSwitch(&DeepSkyCatalogSw, NULL);
+ return;
+ }
+ else
+ currentCatalog = LX200_DEEPSKY_C;
+
+ if (selectSubCatalog(currentCatalog, index))
+ {
+ currentSubCatalog = index;
+ DeepSkyCatalogSw.s = IPS_OK;
+ IDSetSwitch(&DeepSkyCatalogSw, NULL);
+ }
+ else
+ {
+ DeepSkyCatalogSw.s = IPS_IDLE;
+ IDSetSwitch(&DeepSkyCatalogSw, "Catalog unavailable");
+ }
+ return;
+ }
+
+ // Solar system
+ if (!strcmp (name, SolarSw.name))
+ {
+
+ if (checkPower(&SolarSw))
+ return;
+
+ IUResetSwitches(&SolarSw);
+ IUUpdateSwitches(&SolarSw, states, names, n);
+ index = getOnSwitch(&SolarSw);
+
+ // We ignore the first option : "Select item"
+ if (index == 0)
+ {
+ SolarSw.s = IPS_IDLE;
+ IDSetSwitch(&SolarSw, NULL);
+ return;
+ }
+
+ selectSubCatalog ( LX200_STAR_C, LX200_STAR);
+ selectCatalogObject( LX200_STAR_C, index + 900);
+
+ ObjectNo.s = IPS_OK;
+ SolarSw.s = IPS_OK;
+
+ getObjectInfo(ObjectInfo.tp[0].text);
+ IDSetNumber(&ObjectNo , "Object updated.");
+ IDSetSwitch(&SolarSw, NULL);
+
+ if (currentCatalog == LX200_STAR_C || currentCatalog == LX200_DEEPSKY_C)
+ selectSubCatalog( currentCatalog, currentSubCatalog);
+
+ getObjectRA(&targetRA);
+ getObjectDEC(&targetDEC);
+
+ handleCoordSet();
+
+ return;
+ }
+
+ LX200Generic::ISNewSwitch (dev, name, states, names, n);
+
+ }
+
+ void LX200Classic::ISPoll ()
+ {
+
+ LX200Generic::ISPoll();
+
+ }
+
+ void LX200Classic::getBasicData()
+ {
+
+ // process parent first
+ LX200Generic::getBasicData();
+
+ }