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.
tdeedu/kstars/kstars/indi/lx200gps.cpp

341 lines
9.4 KiB

/*
LX200 GPS
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 <unistd.h>
#include "lx200gps.h"
#include "lx200driver.h"
#define GPSGroup "Extended GPS Features"
extern LX200Generic *telescope;
extern int MaxReticleFlashRate;
static ISwitch GPSPowerS[] = {{ "On", "", ISS_OFF, 0, 0}, {"Off", "", ISS_ON, 0, 0}};
static ISwitch GPSStatusS[] = {{ "Sleep", "", ISS_OFF, 0, 0}, {"Wake up", "", ISS_OFF, 0 ,0}, {"Restart", "", ISS_OFF, 0, 0}};
static ISwitch GPSUpdateS[] = { {"Update", "", ISS_OFF, 0, 0}};
static ISwitch AltDecPecS[] = {{ "Enable", "", ISS_OFF, 0 ,0}, {"Disable", "", ISS_OFF, 0 ,0}};
static ISwitch AzRaPecS[] = {{ "Enable", "", ISS_OFF, 0, 0}, {"Disable", "", ISS_OFF, 0 ,0}};
static ISwitch SelenSyncS[] = {{ "Sync", "", ISS_OFF, 0, 0}};
static ISwitch AltDecBackSlashS[] = {{ "Activate", "", ISS_OFF, 0, 0}};
static ISwitch AzRaBackSlashS[] = {{ "Activate", "", ISS_OFF, 0, 0}};
static ISwitch OTAUpdateS[] = {{ "Update", "", ISS_OFF, 0, 0}};
static ISwitchVectorProperty GPSPowerSw = { mydev, "GPS Power", "", GPSGroup, IP_RW, ISR_1OFMANY, 0 , IPS_IDLE, GPSPowerS, NARRAY(GPSPowerS), "", 0};
static ISwitchVectorProperty GPSStatusSw = { mydev, "GPS Status", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, GPSStatusS, NARRAY(GPSStatusS), "", 0};
static ISwitchVectorProperty GPSUpdateSw = { mydev, "GPS System", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, GPSUpdateS, NARRAY(GPSUpdateS), "", 0};
static ISwitchVectorProperty AltDecPecSw = { mydev, "Alt/Dec PEC", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, AltDecPecS, NARRAY(AltDecPecS), "", 0};
static ISwitchVectorProperty AzRaPecSw = { mydev, "Az/Ra PEC", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, AzRaPecS, NARRAY(AzRaPecS), "", 0};
static ISwitchVectorProperty SelenSyncSw = { mydev, "Selenographic Sync", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, SelenSyncS, NARRAY(SelenSyncS), "", 0};
static ISwitchVectorProperty AltDecBackSlashSw = { mydev, "Alt/Dec Anti-backslash", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, AltDecBackSlashS, NARRAY(AltDecBackSlashS), "", 0};
static ISwitchVectorProperty AzRaBackSlashSw = { mydev, "Az/Ra Anti-backslash", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, AzRaBackSlashS, NARRAY(AzRaBackSlashS), "", 0};
static ISwitchVectorProperty OTAUpdateSw = { mydev, "OTA Update", "", GPSGroup, IP_RW, ISR_1OFMANY, 0, IPS_IDLE, OTAUpdateS, NARRAY(OTAUpdateS), "", 0};
static INumber Temp[] = { {"Temp.", "", "%g", -200., 500., 0., 0., 0, 0, 0 } };
static INumberVectorProperty OTATemp = { mydev, "OTA Temperature (C)", "", GPSGroup, IP_RO, 0, IPS_IDLE, Temp, NARRAY(Temp), "", 0};
void updateTemp(void * /*p*/);
void changeLX200GPSDeviceName(const char *newName)
{
strcpy(GPSPowerSw.device, newName);
strcpy(GPSStatusSw.device, newName );
strcpy(GPSUpdateSw.device, newName );
strcpy(AltDecPecSw.device, newName );
strcpy(AzRaPecSw.device,newName );
strcpy(SelenSyncSw.device, newName );
strcpy(AltDecBackSlashSw.device, newName );
strcpy(AzRaBackSlashSw.device, newName );
strcpy(OTATemp.device, newName );
strcpy(OTAUpdateSw.device, newName);
}
LX200GPS::LX200GPS() : LX200_16()
{
IEAddTimer(900000, updateTemp, NULL);
}
void LX200GPS::ISGetProperties (const char *dev)
{
if (dev && strcmp (thisDevice, dev))
return;
// process parent first
LX200_16::ISGetProperties(dev);
IDDefSwitch (&GPSPowerSw, NULL);
IDDefSwitch (&GPSStatusSw, NULL);
IDDefSwitch (&GPSUpdateSw, NULL);
IDDefSwitch (&AltDecPecSw, NULL);
IDDefSwitch (&AzRaPecSw, NULL);
IDDefSwitch (&SelenSyncSw, NULL);
IDDefSwitch (&AltDecBackSlashSw, NULL);
IDDefSwitch (&AzRaBackSlashSw, NULL);
IDDefNumber (&OTATemp, NULL);
IDDefSwitch (&OTAUpdateSw, NULL);
}
void LX200GPS::ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n)
{
// ignore if not ours //
if (strcmp (dev, thisDevice))
return;
LX200_16::ISNewText (dev, name, texts, names, n);
}
void LX200GPS::ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n)
{
LX200_16::ISNewNumber (dev, name, values, names, n);
}
void LX200GPS::ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n)
{
int index;
char msg[64];
if (strcmp (dev, thisDevice))
return;
/* GPS Power */
if (!strcmp(name,GPSPowerSw.name))
{
if (checkPower(&GPSPowerSw))
return;
IUResetSwitches(&GPSPowerSw);
IUUpdateSwitches(&GPSPowerSw, states, names, n);
index = getOnSwitch(&GPSPowerSw);
index == 0 ? turnGPSOn() : turnGPSOff();
GPSPowerSw.s = IPS_OK;
IDSetSwitch (&GPSPowerSw, index == 0 ? "GPS System is ON" : "GPS System is OFF" );
return;
}
/* GPS Status Update */
if (!strcmp(name,GPSStatusSw.name))
{
if (checkPower(&GPSStatusSw))
return;
IUResetSwitches(&GPSStatusSw);
IUUpdateSwitches(&GPSStatusSw, states, names, n);
index = getOnSwitch(&GPSStatusSw);
if (index == 0)
{
gpsSleep();
strcpy(msg, "GPS system is in sleep mode.");
}
else if (index == 1)
{
gpsWakeUp();
strcpy(msg, "GPS system is reactivated.");
}
else
{
gpsRestart();
strcpy(msg, "GPS system is restarting...");
updateTime();
updateLocation();
}
GPSStatusSw.s = IPS_OK;
IDSetSwitch (&GPSStatusSw, "%s", msg);
return;
}
/* GPS Update */
if (!strcmp(name,GPSUpdateSw.name))
{
if (checkPower(&GPSUpdateSw))
return;
GPSUpdateSw.s = IPS_OK;
IDSetSwitch(&GPSUpdateSw, "Updating GPS system. This operation might take few minutes to complete...");
if (updateGPS_System())
{
IDSetSwitch(&GPSUpdateSw, "GPS system update successful.");
updateTime();
updateLocation();
}
else
{
GPSUpdateSw.s = IPS_IDLE;
IDSetSwitch(&GPSUpdateSw, "GPS system update failed.");
}
return;
}
/* Alt Dec Periodic Error correction */
if (!strcmp(name, AltDecPecSw.name))
{
if (checkPower(&AltDecPecSw))
return;
IUResetSwitches(&AltDecPecSw);
IUUpdateSwitches(&AltDecPecSw, states, names, n);
index = getOnSwitch(&AltDecPecSw);
if (index == 0)
{
enableDecAltPec();
strcpy (msg, "Alt/Dec Compensation Enabled");
}
else
{
disableDecAltPec();
strcpy (msg, "Alt/Dec Compensation Disabled");
}
AltDecPecSw.s = IPS_OK;
IDSetSwitch(&AltDecPecSw, "%s", msg);
return;
}
/* Az RA periodic error correction */
if (!strcmp(name, AzRaPecSw.name))
{
if (checkPower(&AzRaPecSw))
return;
IUResetSwitches(&AzRaPecSw);
IUUpdateSwitches(&AzRaPecSw, states, names, n);
index = getOnSwitch(&AzRaPecSw);
if (index == 0)
{
enableRaAzPec();
strcpy (msg, "Ra/Az Compensation Enabled");
}
else
{
disableRaAzPec();
strcpy (msg, "Ra/Az Compensation Disabled");
}
AzRaPecSw.s = IPS_OK;
IDSetSwitch(&AzRaPecSw, "%s", msg);
return;
}
if (!strcmp(name, AltDecBackSlashSw.name))
{
if (checkPower(&AltDecBackSlashSw))
return;
activateAltDecAntiBackSlash();
AltDecBackSlashSw.s = IPS_OK;
IDSetSwitch(&AltDecBackSlashSw, "Alt/Dec Anti-backslash enabled");
return;
}
if (!strcmp(name, AzRaBackSlashSw.name))
{
if (checkPower(&AzRaBackSlashSw))
return;
activateAzRaAntiBackSlash();
AzRaBackSlashSw.s = IPS_OK;
IDSetSwitch(&AzRaBackSlashSw, "Az/Ra Anti-backslash enabled");
return;
}
if (!strcmp(name, OTAUpdateSw.name))
{
if (checkPower(&OTAUpdateSw))
return;
IUResetSwitches(&OTAUpdateSw);
if (getOTATemp(&OTATemp.np[0].value) < 0)
{
OTATemp.s = IPS_ALERT;
IDSetNumber(&OTATemp, "Error: OTA temperature read timed out.");
}
else
{
OTATemp.s = IPS_OK;
IDSetNumber(&OTATemp, NULL);
}
return;
}
LX200_16::ISNewSwitch (dev, name, states, names, n);
}
void LX200GPS::ISPoll ()
{
LX200_16::ISPoll();
}
void updateTemp(void * /*p*/)
{
if (telescope->isTelescopeOn())
{
if (getOTATemp(&OTATemp.np[0].value) < 0)
{
OTATemp.s = IPS_ALERT;
IDSetNumber(&OTATemp, "Error: OTA temperature read timed out.");
return;
}
else
{
OTATemp.s = IPS_OK;
IDSetNumber(&OTATemp, NULL);
}
}
IEAddTimer(900000, updateTemp, NULL);
}
void LX200GPS::getBasicData()
{
//getOTATemp(&OTATemp.np[0].value);
//IDSetNumber(&OTATemp, NULL);
// process parent
LX200_16::getBasicData();
}