diff options
Diffstat (limited to 'kstars/kstars/indi/lx200gps.cpp')
-rw-r--r-- | kstars/kstars/indi/lx200gps.cpp | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/kstars/kstars/indi/lx200gps.cpp b/kstars/kstars/indi/lx200gps.cpp new file mode 100644 index 00000000..451a7269 --- /dev/null +++ b/kstars/kstars/indi/lx200gps.cpp @@ -0,0 +1,340 @@ +/* + 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(); + } + |