You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
334 lines
9.2 KiB
334 lines
9.2 KiB
/*
|
|
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 tqparent first
|
|
LX200Generic::getBasicData();
|
|
|
|
}
|