39#include <libnova/libnova.h>
41#define PRODUCT_TAB "Product"
42#define ALIGNMENT_TAB "Alignment"
43#define LX200_TIMEOUT 5
46#define REFRACTION_MODEL_TEMPERATURE "REFRACTION_MODEL_TEMPERATURE"
47#define REFRACTION_MODEL_PRESSURE "REFRACTION_MODEL_PRESSURE"
48#define MODEL_COUNT "MODEL_COUNT"
49#define ALIGNMENT_POINTS "ALIGNMENT_POINTS"
50#define ALIGNMENT_STATE "Alignment"
51#define MINIMAL_NEW_ALIGNMENT_POINT_RO "MINIMAL_NEW_ALIGNMENT_POINT_RO"
52#define MINIMAL_NEW_ALIGNMENT_POINT "MINIMAL_NEW_ALIGNMENT_POINT"
53#define NEW_ALIGNMENT_POINT "NEW_ALIGNMENT_POINT"
54#define NEW_ALIGNMENT_POINTS "NEW_ALIGNMENT_POINTS"
55#define NEW_MODEL_NAME "NEW_MODEL_NAME"
56#define PRODUCT_INFO "PRODUCT_INFO"
57#define TLE_TEXT "TLE_TEXT"
58#define TLE_NUMBER "TLE_NUMBER"
59#define TRAJECTORY_TIME "TRAJECTORY_TIME"
60#define SAT_TRACKING_STAT "SAT_TRACKING_STAT"
61#define UNATTENDED_FLIP "UNATTENDED_FLIP"
62#define WAKE_ON_LAN_MAC "WAKE_ON_LAN_MAC"
63#define WAKE_ON_LAN_SEND "WAKE_ON_LAN_SEND"
64#define MOUNT_SHUTDOWN "MOUNT_SHUTDOWN"
108 LOG_INFO(
"Setting Ultra Precision Mode.");
116 LOG_ERROR(
"Failed to set Ultra Precision Mode.");
195 char wolMacBuf[128] = {};
200 IUFillSwitchVector(&
WoLSendSP,
WoLSendS, 1,
getDeviceName(),
WAKE_ON_LAN_SEND,
"Wake on LAN",
CONNECTION_TAB,
IP_RW,
ISR_ATMOST1, 60,
IPS_IDLE);
260 LOGF_INFO(
"Unattended Flip from config and mount are %s",
265 LOGF_INFO(
"Read Unattended Flip %s from config while mount has %s, updating mount",
273 LOG_INFO(
"Did not find an Unattended Flip setting in the config file. Specify desired behaviour in Motion Control tab and save config in Options tab.");
313 LOG_WARN(
"Failed to get tracking frequency from device.");
321 char RefractionModelTemperature[80];
324 sscanf(RefractionModelTemperature,
"%f#", &rmtemp);
329 char RefractionModelPressure[80];
332 sscanf(RefractionModelPressure,
"%f#", &rmpres);
353 LOG_INFO(
"Unattended Flip is disabled.");
359 LOG_INFO(
"Unattended Flip is enabled.");
367 LOG_INFO(
"sendLocationOnStartup is enabled, call sendScopeLocation.");
372 LOG_INFO(
"sendLocationOnStartup is disabled, do not call sendScopeLocation.");
376 LOG_INFO(
"sendTimeOnStartup is enabled, call sendScopeTime.");
381 LOG_INFO(
"sendTimeOnStartup is disabled, do not call sendScopeTime.");
386bool LX200_10MICRON::getMountInfo()
388 char ProductName[80];
392 char FirmwareVersion[80];
394 char FirmwareDate1[80];
396 char FirmwareDate2[80];
399 sscanf(FirmwareDate1,
"%s %02d %04d", mon, &dd, &yyyy);
401 char FirmwareDate[80];
402 snprintf(FirmwareDate, 80,
"%04d-%02d-%02dT%s", yyyy,
monthToNumber(mon), dd, FirmwareDate2);
404 LOGF_INFO(
"Product:%s Control box:%s Firmware:%s of %s", ProductName, ControlBox, FirmwareVersion, FirmwareDate);
454 char cmd[] =
"#:Ginfo#";
458 int nbytes_write = 0, nbytes_read = 0;
465 tcflush(fd, TCIFLUSH);
470 term = strchr(data,
'#');
483 nbytes_read = sscanf(data,
"%g,%g,%c,%g,%g,%g,%d,%d#", &Ginfo.RA_JNOW, &Ginfo.DEC_JNOW, &Ginfo.SideOfPier,
484 &Ginfo.AZ, &Ginfo.ALT, &Ginfo.Jdate, &Ginfo.Gstat, &Ginfo.SlewStatus);
490 if (Ginfo.Gstat != OldGstat)
494 LOGF_INFO(
"Gstat changed from %d to %d", OldGstat, Ginfo.Gstat);
498 LOGF_INFO(
"Gstat initialized at %d", Ginfo.Gstat);
552 OldGstat = Ginfo.Gstat;
553 NewRaDec(Ginfo.RA_JNOW, Ginfo.DEC_JNOW);
556 char LocalSiderealTimeS[80];
558 f_scansexa(LocalSiderealTimeS, &Ginfo.SiderealTime);
623 LOG_ERROR(
"Start tracking command failed");
632 LOG_ERROR(
"Stop tracking command failed");
659 return '1' == guaf[0];
671 snprintf(data,
sizeof(data),
"#:Suaf%d#", (setting ==
false) ? 0 : 1);
674 if (setting ==
false)
694bool LX200_10MICRON::flip()
706 snprintf(data,
sizeof(data),
"#:FLIP#");
741 snprintf(data,
sizeof(data),
":SC%04d-%02d-%02d#", years, months, days);
763 LOGF_INFO(
"The function is called with TLE %s", tle);
764 if (strlen(tle) > 230)
770 std::string sep =
"$0a";
771 std::string search =
"\n";
772 tle_str = (std::string) tle;
773 for(
size_t pos = 0; ; pos += sep.length() )
776 pos = tle_str.find( search, pos );
777 if( pos == std::string::npos )
break;
779 tle_str.erase( pos, search.length() );
780 tle_str.insert( pos, sep );
783 snprintf(command,
sizeof(command),
":TLEL0%s#", tle_str.c_str());
794 if (response[0] ==
'E')
796 LOG_ERROR(
"Invalid formatting of TLE, trying to split:");
797 char *pch = strtok ((
char*) tle,
"\n");
798 while (pch !=
nullptr)
801 pch = strtok (
nullptr,
"\n");
808 char *pch = strtok ((
char*) tle,
"\n");
809 while (pch !=
nullptr)
812 pch = strtok (
nullptr,
"\n");
829 snprintf(command,
sizeof(command),
":TLEDL%d#", tleN);
831 LOG_INFO(
"Setting TLE from Database");
841 if (response[0] ==
'E')
863 struct ln_date start_pass;
864 if (
extractISOTime(start_pass_isodatetime.c_str(), &start_pass) == -1)
866 LOGF_ERROR(
"Date/Time is invalid: %s.", start_pass_isodatetime.c_str());
870 struct ln_date end_pass;
871 if (
extractISOTime(end_pass_isodatetime.c_str(), &end_pass) == -1)
873 LOGF_ERROR(
"Date/Time is invalid: %s.", end_pass_isodatetime.c_str());
879 JD_start = ln_get_julian_day(&start_pass);
880 JD_end = ln_get_julian_day(&end_pass);
881 int nextPassInMinutes =
static_cast<int>(ceil((JD_end - JD_start) * 24 * 60));
882 int nextPassinMinutesUpTo1440 = std::min(nextPassInMinutes, 1440);
883 int nextPassinMinutesBetween1and1440 = std::max(nextPassinMinutesUpTo1440, 1);
886 snprintf(command,
sizeof(command),
":TLEP%7.8f,%01d#", JD_start, nextPassinMinutesBetween1and1440);
888 LOGF_INFO(
"For the next %01d minutes", nextPassinMinutesBetween1and1440);
899 if (response[0] ==
'E')
901 LOG_ERROR(
"TLE not loaded or invalid command");
904 if (response[0] ==
'N')
925 snprintf(command,
sizeof(command),
":TLES#");
935 if (response[0] ==
'E')
940 if (response[0] ==
'F')
945 if (response[0] ==
'V')
947 LOG_INFO(
"Slewing to start of transit");
950 if (response[0] ==
'S')
952 LOG_INFO(
"Slewing to transiting satellite");
955 if (response[0] ==
'Q')
973 snprintf(data, 16,
"#:SRTMP%0+6.1f#",
temperature);
987 snprintf(data, 16,
"#:SRPRS%06.1f#", pressure);
1010 char MRa_str[32], MDec_str[32];
1011 fs_sexa(MRa_str, MRa, 0, 36000);
1012 fs_sexa(MDec_str, MDec, 0, 3600);
1015 (
static_cast<int>(MSide) == 0) ? MSide_char =
'E' : MSide_char =
'W';
1017 char PRa_str[32], PDec_str[32];
1018 fs_sexa(PRa_str, PRa, 0, 36000);
1019 fs_sexa(PDec_str, PDec, 0, 3600);
1021 char SidTime_str[32];
1022 fs_sexa(SidTime_str, SidTime, 0, 36000);
1025 snprintf(command, 80,
"#:newalpt%s,%s,%c,%s,%s,%s#", MRa_str, MDec_str, MSide_char, PRa_str, PDec_str, SidTime_str);
1036 int nbytes_read = sscanf(response,
"%3d#", &points);
1037 if (nbytes_read < 0)
1039 LOGF_ERROR(
"AddSyncPoint response error %d", nbytes_read);
1042 LOGF_INFO(
"AddSyncPoint responded [%4s], there are now %d new alignment points", response, points);
1051 double MSide = (toupper(Ginfo.SideOfPier) ==
'E') ? 0 : 1;
1052 return AddSyncPoint(Ginfo.RA_JNOW, Ginfo.DEC_JNOW, MSide, PRa, PDec, Ginfo.SiderealTime);
1064 LOG_ERROR(
"SetRefractionModelTemperature error");
1079 LOG_ERROR(
"SetRefractionModelPressure error");
1108 LOG_ERROR(
"Cannot add alignment points yet, need to start a new alignment first");
1128 LOG_ERROR(
"Cannot add alignment points yet, need to start a new alignment first");
1153 if (strcmp(name,
"TLE_NUMBER") == 0)
1155 LOG_INFO(
"I am trying to set from Database");
1191 LOG_INFO(
"Alignment state is IDLE");
1238 LOG_ERROR(
"Delete current alignment error");
1243 LOG_INFO(
"Current Alignment deleted");
1292 LOGF_ERROR(
"Unknown tracking modus %d", index);
1306 LOG_ERROR(
"Setting unattended flip failed");
1311 LOG_INFO(
"Unattended flip disabled");
1316 LOG_ERROR(
"Setting unattended flip failed");
1321 LOG_INFO(
"Unattended flip enabled");
1335 if (sendWakeOnLanPacket())
1338 LOG_INFO(
"Wake on LAN packet sent successfully.");
1343 LOG_ERROR(
"Failed to send Wake on LAN packet.");
1354 LOG_WARN(
"Mount must be parked before shutdown.");
1362 LOG_ERROR(
"Mount shutdown command failed.");
1367 LOG_INFO(
"Mount shutdown initiated. Disconnecting before mount powers off.");
1370 m_ShutdownPending =
true;
1391 if (strcmp(name,
"SAT_TLE_TEXT") == 0)
1410 LOG_ERROR(
"TLE was not correctly uploaded");
1414 if (strcmp(name,
"SAT_PASS_WINDOW") == 0)
1428 LOG_ERROR(
"Trajectory could not be calculated");
1452 entry month_table[] = { {
"Jan", 1 }, {
"Feb", 2 }, {
"Mar", 3 }, {
"Apr", 4 }, {
"May", 5 },
1453 {
"Jun", 6 }, {
"Jul", 7 }, {
"Aug", 8 }, {
"Sep", 9 }, {
"Oct", 10 },
1454 {
"Nov", 11 }, {
"Dec", 12 }, {
nullptr, 0 }
1456 entry *p = month_table;
1457 while (p->name !=
nullptr)
1459 if (strcasecmp(p->name, monthName) == 0)
1469 int nbytes_write = 0;
1472 tcflush(
fd, TCIFLUSH);
1475 LOGF_ERROR(
"CMD <%s> write ERROR %d", data, error_type);
1478 tcflush(
fd, TCIFLUSH);
1484 char bool_return[2];
1486 int nbytes_write = 0, nbytes_read = 0;
1489 tcflush(
fd, TCIFLUSH);
1492 LOGF_ERROR(
"CMD <%s> write ERROR %d", data, error_type);
1496 tcflush(
fd, TCIFLUSH);
1498 if (nbytes_read < 1)
1500 LOGF_ERROR(
"CMD <%s> read ERROR %d", data, error_type);
1504 if (bool_return[0] != expect[0])
1518 int nbytes_write = 0, nbytes_read = 0;
1521 tcflush(
fd, TCIFLUSH);
1524 LOGF_ERROR(
"CMD <%s> write ERROR %d", data, error_type);
1528 tcflush(
fd, TCIFLUSH);
1530 if (nbytes_read < 1)
1532 LOGF_ERROR(
"CMD <%s> read ERROR %d", data, error_type);
1539void LX200_10MICRON::TimerHit()
1541 if (m_ShutdownPending)
1543 m_ShutdownPending =
false;
1553bool LX200_10MICRON::sendWakeOnLanPacket()
1555 const char *macStr =
WoLMacT[0].text;
1556 if (!macStr || macStr[0] ==
'\0')
1558 LOG_ERROR(
"WoL: MAC address not configured.");
1562 std::string
cmd =
"wakeonlan " + std::string(macStr);
1563 int ret = system(
cmd.c_str());
1566 LOGF_INFO(
"WoL: magic packet sent to %s", macStr);
1571 LOG_ERROR(
"WoL: wakeonlan tool not found. Please install it on your system.");
1574 LOG_ERROR(
"WoL: wakeonlan failed to send the packet.");
INDI::PropertyText getText(const char *name) const
virtual bool Disconnect()
Disconnect from device.
virtual void setConnected(bool status, IPState state=IPS_OK, const char *msg=nullptr)
Set connection switch status in the client.
void setVersion(uint16_t vMajor, uint16_t vMinor)
Set driver version information to be defined in DRIVER_INFO property as vMajor.vMinor.
virtual bool deleteProperty(const char *propertyName)
Delete a property and unregister it. It will also be deleted from all clients.
void defineProperty(INumberVectorProperty *property)
virtual void TimerHit()
Callback function to be called once SetTimer duration elapses.
bool isSimulation() const
int SetTimer(uint32_t ms)
Set a timer to call the function TimerHit after ms milliseconds.
void setState(IPState state)
void apply(const char *format,...) const ATTRIBUTE_FORMAT_PRINTF(2
bool isNameMatch(const char *otherName) const
bool update(const ISState states[], const char *const names[], int n)
int findOnSwitchIndex() const
void fill(const char *device, const char *name, const char *label, const char *group, IPerm permission, ISRule rule, double timeout, IPState state)
bool update(const char *const texts[], const char *const names[], int n)
TelescopeStatus TrackState
void SetTelescopeCapability(uint32_t cap, uint8_t slewRateCount)
SetTelescopeCapability sets the Telescope capabilities. All capabilities must be initialized.
bool isParked()
isParked is mount currently parked?
virtual void SetParked(bool isparked)
SetParked Change the mount parking status. The data park file (stored in ~/.indi/ParkData....
@ TELESCOPE_HAS_TRACK_RATE
@ TELESCOPE_HAS_PIER_SIDE
@ TELESCOPE_CAN_TRACK_SATELLITE
@ TELESCOPE_HAS_TRACK_MODE
@ TELESCOPE_CAN_CONTROL_TRACK
void NewRaDec(double ra, double dec)
The child class calls this function when it has updates.
void setPierSide(TelescopePierSide side)
virtual bool saveConfigItems(FILE *fp) override
saveConfigItems Save specific properties in the provide config file handler. Child class usually over...
virtual bool initProperties() override
Called to initialize basic properties required all the time.
@ LX200_HAS_PULSE_GUIDING
@ LX200_HAS_TRACKING_FREQ
virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override
Process the client newNumber command.
virtual bool sendScopeLocation()
bool sendLocationOnStartup
virtual bool Abort() override
Abort any telescope motion including tracking if possible.
virtual bool updateProperties() override
Called when connected state changes, to add/remove properties.
INumberVectorProperty TrackFreqNP
virtual void ISGetProperties(const char *dev) override
define the driver's properties to the client. Usually, only a minimum set of properties are defined t...
virtual bool ISNewText(const char *dev, const char *name, char *texts[], char *names[], int n) override
Process the client newSwitch command.
virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override
Process the client newSwitch command.
virtual bool sendScopeTime()
void setLX200Capability(uint32_t cap)
INumber RefractionModelTemperatureN[1]
void ISGetProperties(const char *dev) override
define the driver's properties to the client. Usually, only a minimum set of properties are defined t...
void getBasicData() override
bool Handshake() override
perform handshake with device to check communication
bool saveConfigItems(FILE *fp) override
saveConfigItems Save specific properties in the provide config file handler. Child class usually over...
INumberVectorProperty ModelCountNP
INumberVectorProperty NewAlignmentPointsNP
ISwitchVectorProperty AlignmentStateSP
ITextVectorProperty NewModelNameTP
bool CalculateSatTrajectory(std::string start_pass_isodatetime, std::string end_pass_isodatetime)
INumberVectorProperty NewAlpNP
INumber NewAlignmentPointsN[1]
int setStandardProcedureAndExpectChar(int fd, const char *data, const char *expect)
ITextVectorProperty WoLMacTP
@ UNATTENDED_FLIP_DISABLED
@ UNATTENDED_FLIP_ENABLED
bool UnPark() override
Unpark the telescope if already parked.
int monthToNumber(const char *monthName)
INumberVectorProperty RefractionModelPressureNP
bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override
Process the client newSwitch command.
int setStandardProcedureWithoutRead(int fd, const char *data)
INumberVectorProperty RefractionModelTemperatureNP
bool SetTLEtoFollow(const char *tle)
ISwitchVectorProperty WoLSendSP
bool getUnattendedFlipSetting()
ITextVectorProperty ProductTP
bool setLocalDate(uint8_t days, uint8_t months, uint16_t years) override
bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override
Process the client newNumber command.
const char * getDefaultName() override
virtual int SetRefractionModelPressure(double pressure)
INumber MiniNewAlpN[MALP_COUNT]
bool ISNewText(const char *dev, const char *name, char *texts[], char *names[], int n) override
Process the client newSwitch command.
INumberVectorProperty TLEfromDatabaseNP
INumber NewAlpN[ALP_COUNT]
int setStandardProcedureAndReturnResponse(int fd, const char *data, char *response, int max_response_length)
@ GSTAT_SLEWING_OR_STOPPING
@ GSTAT_TRACKING_OUTSIDE_LIMITS
@ GSTAT_FOLLOWING_SATELLITE
@ GSTAT_NOT_TRACKING_AND_NOT_MOVING
bool ReadScopeStatus() override
Read telescope status.
ISwitch UnattendedFlipS[UNATTENDED_FLIP_COUNT]
bool initProperties() override
Called to initialize basic properties required all the time.
INDI::PropertySwitch MountShutdownSP
INumber MiniNewAlpRON[MALPRO_COUNT]
bool updateProperties() override
Called when connected state changes, to add/remove properties.
virtual int SetRefractionModelTemperature(double temperature)
bool SetTrackEnabled(bool enabled) override
SetTrackEnabled Engages or disengages mount tracking. If there are no tracking modes available,...
bool Park() override
Park the telescope to its home position.
bool SyncConfigBehaviour(bool cmcfg)
@ PRODUCT_FIRMWARE_VERSION
INumberVectorProperty MiniNewAlpRONP
ISwitchVectorProperty UnattendedFlipSP
bool Flip(double ra, double dec) override
Move and flip the scope to the supplied RA and DEC coordinates.
INumber TLEfromDatabaseN[1]
INumber AlignmentPointsN[1]
int AddSyncPoint(double MRa, double MDec, double MSide, double PRa, double PDec, double SidTime)
INumberVectorProperty MiniNewAlpNP
ISwitch AlignmentStateS[ALIGN_COUNT]
INumberVectorProperty AlignmentPointsNP
bool SetTLEfromDatabase(int tleN)
int AddSyncPointHere(double PRa, double PDec)
bool setUnattendedFlipSetting(bool setting)
INumber RefractionModelPressureN[1]
const char * CONNECTION_TAB
CONNECTION_TAB Where all device connection settings (serial, usb, ethernet) are defined and controlle...
const char * MAIN_CONTROL_TAB
MAIN_CONTROL_TAB Where all the primary controls for the device are located.
const char * SATELLITE_TAB
SATELLITE_TAB.
const char * MOTION_TAB
MOTION_TAB Where all the motion control properties of the device are located.
INDI::PropertySwitch ParkSP
INDI::PropertyText TLEtoTrackTP
Text Vector property defining the orbital elements of an artificial satellite (TLE)....
INDI::PropertyText SatPassWindowTP
Text Vector property defining the start and end of a satellite pass (window contains pass)....
INDI::PropertySwitch TrackSatSP
Switch Vector property defining the state of the satellite tracking of the mount. Example implementat...
@ SAT_PASS_WINDOW_END
Index for end of the window.
@ SAT_PASS_WINDOW_START
Index for start of the window.
@ SAT_HALT
Halt signal (abort)
int tty_read_section(int fd, char *buf, char stop_char, int timeout, int *nbytes_read)
read buffer from terminal with a delimiter
int f_scansexa(const char *str0, double *dp)
convert sexagesimal string str AxBxC to double. x can be anything non-numeric. Any missing A,...
int tty_read(int fd, char *buf, int nbytes, int timeout, int *nbytes_read)
read buffer from terminal
int tty_write_string(int fd, const char *buf, int *nbytes_written)
Writes a null terminated string to fd.
int fs_sexa(char *out, double a, int w, int fracbase)
Converts a sexagesimal number to a string. sprint the variable a in sexagesimal format into out[].
Implementations for common driver routines.
int extractISOTime(const char *timestr, struct ln_date *iso_date)
Extract ISO 8601 time and store it in a tm struct.
void IUSaveConfigSwitch(FILE *fp, const ISwitchVectorProperty *svp)
Add a switch vector property value to the configuration file.
void IUFillNumberVector(INumberVectorProperty *nvp, INumber *np, int nnp, const char *dev, const char *name, const char *label, const char *group, IPerm p, double timeout, IPState s)
Assign attributes for a number vector property. The vector's auxiliary elements will be set to NULL.
int IUFindOnSwitchIndex(const ISwitchVectorProperty *svp)
Returns the index of first ON switch it finds in the vector switch property.
void IUResetSwitch(ISwitchVectorProperty *svp)
Reset all switches in a switch vector property to OFF.
void IUFillTextVector(ITextVectorProperty *tvp, IText *tp, int ntp, const char *dev, const char *name, const char *label, const char *group, IPerm p, double timeout, IPState s)
Assign attributes for a text vector property. The vector's auxiliary elements will be set to NULL.
void IUSaveText(IText *tp, const char *newtext)
Function to reliably save new text in a IText.
void IUFillSwitch(ISwitch *sp, const char *name, const char *label, ISState s)
Assign attributes for a switch property. The switch's auxiliary elements will be set to NULL.
void IUFillText(IText *tp, const char *name, const char *label, const char *initialText)
Assign attributes for a text property. The text's auxiliary elements will be set to NULL.
void IUFillNumber(INumber *np, const char *name, const char *label, const char *format, double min, double max, double step, double value)
Assign attributes for a number property. The number's auxiliary elements will be set to NULL.
void IUSaveConfigText(FILE *fp, const ITextVectorProperty *tvp)
Add a text vector property value to the configuration file.
void IUFillSwitchVector(ISwitchVectorProperty *svp, ISwitch *sp, int nsp, const char *dev, const char *name, const char *label, const char *group, IPerm p, ISRule r, double timeout, IPState s)
Assign attributes for a switch vector property. The vector's auxiliary elements will be set to NULL.
int IUUpdateSwitch(ISwitchVectorProperty *svp, ISState *states, char *names[], int n)
Update all switches in a switch vector property.
void IDSetNumber(const INumberVectorProperty *nvp, const char *fmt,...)
void IDSetSwitch(const ISwitchVectorProperty *svp, const char *fmt,...)
int IUUpdateText(ITextVectorProperty *tvp, char *texts[], char *names[], int n)
Update all text members in a text vector property.
int IUGetConfigText(const char *dev, const char *property, const char *member, char *value, int len)
IUGetConfigText Opens configuration file and reads single text property.
int IUUpdateNumber(INumberVectorProperty *nvp, double values[], char *names[], int n)
Update all numbers in a number vector property.
void IDSetText(const ITextVectorProperty *tvp, const char *fmt,...)
int IUGetConfigSwitch(const char *dev, const char *property, const char *member, ISState *value)
IUGetConfigSwitch Opens configuration file and reads single switch property.
#define LOGF_INFO(fmt,...)
#define LOG_ERROR(txt)
Shorter logging macros. In order to use these macros, the function (or method) "getDeviceName()" must...
#define LOGF_ERROR(fmt,...)
#define DEBUGFDEVICE(device, priority, msg,...)
#define NEW_ALIGNMENT_POINT
#define MINIMAL_NEW_ALIGNMENT_POINT
#define REFRACTION_MODEL_PRESSURE
#define NEW_ALIGNMENT_POINTS
#define MINIMAL_NEW_ALIGNMENT_POINT_RO
#define REFRACTION_MODEL_TEMPERATURE
int getCommandInt(int fd, int *value, const char *cmd)
int setStandardProcedure(int fd, const char *data)
int checkLX200EquatorialFormat(int fd)
int setCommandInt(int fd, int data, const char *cmd)
int getTrackFreq(int fd, double *value)
int getCommandString(int fd, char *data, const char *cmd)