diff --git a/drivers.xml b/drivers.xml
index 514024c58a..029038344b 100644
--- a/drivers.xml
+++ b/drivers.xml
@@ -177,31 +177,31 @@
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ieq_telescope
@@ -241,19 +241,19 @@
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_ioptronv3_telescope
- 1.6
+ 1.7
indi_lx200pulsar2
diff --git a/drivers/telescope/ioptronv3.cpp b/drivers/telescope/ioptronv3.cpp
index e28f745540..07d88e1bb4 100644
--- a/drivers/telescope/ioptronv3.cpp
+++ b/drivers/telescope/ioptronv3.cpp
@@ -44,28 +44,30 @@ static std::unique_ptr scope(new IOptronV3());
/* Constructor */
IOptronV3::IOptronV3()
{
- setVersion(1, 6);
+ setVersion(1, 7);
driver.reset(new Driver(getDeviceName()));
scopeInfo.gpsStatus = GPS_OFF;
- scopeInfo.systemStatus = ST_STOPPED;
scopeInfo.trackRate = TR_SIDEREAL;
- /* v3.0 use default PEC Settings */
scopeInfo.systemStatus = ST_TRACKING_PEC_OFF;
- // End Mod */
scopeInfo.slewRate = SR_MAX;
scopeInfo.timeSource = TS_RS232;
scopeInfo.hemisphere = HEMI_NORTH;
DBG_SCOPE = INDI::Logger::getInstance().addDebugLevel("Scope Verbose", "SCOPE");
- SetTelescopeCapability(TELESCOPE_CAN_PARK | TELESCOPE_CAN_SYNC | TELESCOPE_CAN_GOTO | TELESCOPE_CAN_ABORT |
- /* v3.0 use default PEC Settings */
+ SetTelescopeCapability(TELESCOPE_CAN_PARK |
+ TELESCOPE_CAN_SYNC |
+ TELESCOPE_CAN_GOTO |
+ TELESCOPE_CAN_ABORT |
TELESCOPE_HAS_PEC |
- // End Mod */
- TELESCOPE_HAS_TIME | TELESCOPE_HAS_LOCATION | TELESCOPE_HAS_TRACK_MODE |
- TELESCOPE_CAN_CONTROL_TRACK | TELESCOPE_HAS_TRACK_RATE | TELESCOPE_HAS_PIER_SIDE,
+ TELESCOPE_HAS_TIME |
+ TELESCOPE_HAS_LOCATION |
+ TELESCOPE_HAS_TRACK_MODE |
+ TELESCOPE_CAN_CONTROL_TRACK |
+ TELESCOPE_HAS_TRACK_RATE |
+ TELESCOPE_HAS_PIER_SIDE,
9);
}
@@ -176,16 +178,15 @@ bool IOptronV3::initProperties()
0, IPS_IDLE);
/* Meridian Behavior */
- IUFillSwitch(&MeridianActionS[IOP_MB_STOP], "IOP_MB_STOP", "Stop", ISS_ON);
- IUFillSwitch(&MeridianActionS[IOP_MB_FLIP], "IOP_MB_FLIP", "Flip", ISS_OFF);
- IUFillSwitchVector(&MeridianActionSP, MeridianActionS, 2, getDeviceName(), "MERIDIAN_ACTION", "Action", MB_TAB, IP_RW,
- ISR_1OFMANY,
- 0, IPS_IDLE);
+ MeridianActionSP[IOP_MB_STOP].fill("IOP_MB_STOP", "Stop", ISS_ON);
+ MeridianActionSP[IOP_MB_FLIP].fill("IOP_MB_FLIP", "Flip", ISS_OFF);
+ MeridianActionSP.fill(getDeviceName(), "MERIDIAN_ACTION", "Action", MB_TAB, IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
+ MeridianActionSP.load();
/* Meridian Limit */
- IUFillNumber(&MeridianLimitN[0], "VALUE", "Degrees", "%.f", 0, 10, 1, 0);
- IUFillNumberVector(&MeridianLimitNP, MeridianLimitN, 1, getDeviceName(), "MERIDIAN_LIMIT", "Limit", MB_TAB, IP_RW, 60,
- IPS_IDLE);
+ MeridianLimitNP[0].fill("VALUE", "Degrees", "%.f", 0, 10, 1, 0);
+ MeridianLimitNP.fill(getDeviceName(), "MERIDIAN_LIMIT", "Limit", MB_TAB, IP_RW, 60, IPS_IDLE);
+ MeridianLimitNP.load();
// Baud rates.
// 230400 for 120
@@ -242,8 +243,8 @@ bool IOptronV3::updateProperties()
defineProperty(&DaylightSP);
defineProperty(&CWStateSP);
- defineProperty(&MeridianActionSP);
- defineProperty(&MeridianLimitNP);
+ defineProperty(MeridianActionSP);
+ defineProperty(MeridianLimitNP);
getStartupData();
}
@@ -268,8 +269,8 @@ bool IOptronV3::updateProperties()
deleteProperty(DaylightSP.name);
deleteProperty(CWStateSP.name);
- deleteProperty(MeridianActionSP.name);
- deleteProperty(MeridianLimitNP.name);
+ deleteProperty(MeridianActionSP);
+ deleteProperty(MeridianLimitNP);
}
return true;
@@ -368,11 +369,13 @@ void IOptronV3::getStartupData()
uint8_t degrees = 0;
if (driver->getMeridianBehavior(action, degrees))
{
- IUResetSwitch(&MeridianActionSP);
- MeridianActionS[action].s = ISS_ON;
- MeridianActionSP.s = IPS_OK;
+ MeridianActionSP.reset();
+ MeridianActionSP[action].setState(ISS_ON);
+ MeridianActionSP.setState(IPS_OK);
+ MeridianLimitNP[0].setValue(degrees);
- MeridianLimitN[0].value = degrees;
+ LOGF_INFO("Reading mount meridian behavior: When mount reaches %.f degrees past meridian, it will %s.",
+ MeridianLimitNP[0].getValue(), MeridianActionSP[IOP_MB_STOP].getState() == ISS_ON ? "stop" : "flip");
}
double parkAZ = LocationN[LOCATION_LATITUDE].value >= 0 ? 0 : 180;
@@ -452,18 +455,26 @@ bool IOptronV3::ISNewNumber(const char *dev, const char *name, double values[],
/****************************************
Meridian Flip Limit
*****************************************/
- if (!strcmp(name, MeridianLimitNP.name))
+ if (MeridianLimitNP.isNameMatch(name))
{
- IUUpdateNumber(&MeridianLimitNP, values, names, n);
- MeridianLimitNP.s = driver->setMeridianBehavior(static_cast(IUFindOnSwitchIndex(&MeridianActionSP)),
- MeridianLimitN[0].value) ? IPS_OK : IPS_ALERT;
- if (MeridianLimitNP.s == IPS_OK)
+ auto lastLimit = MeridianLimitNP[0].getValue();
+ MeridianLimitNP.update(values, names, n);
+ // Only update driver if there is an actual change
+ if (lastLimit != MeridianLimitNP[0].getValue())
{
- LOGF_INFO("Mount Meridian Behavior: When mount reaches %.f degrees past meridian, it will %s.",
- MeridianLimitN[0].value, MeridianActionS[IOP_MB_STOP].s == ISS_ON ? "stop" : "flip");
+ MeridianLimitNP.setState(driver->setMeridianBehavior(static_cast(MeridianActionSP.findOnSwitchIndex()),
+ MeridianLimitNP[0].getValue()) ? IPS_OK : IPS_ALERT);
+ if (MeridianLimitNP.getState() == IPS_OK)
+ {
+ LOGF_INFO("Setting mount meridian behavior: When mount reaches %.f degrees past meridian, it will %s.",
+ MeridianLimitNP[0].getValue(), MeridianActionSP[IOP_MB_STOP].getState() == ISS_ON ? "stop" : "flip");
+ }
}
- IDSetNumber(&MeridianLimitNP, nullptr);
- saveConfig(true, MeridianLimitNP.name);
+ else
+ MeridianLimitNP.setState(IPS_OK);
+
+ MeridianLimitNP.apply();
+ saveConfig(MeridianLimitNP);
return true;
}
@@ -497,8 +508,8 @@ bool IOptronV3::ISNewSwitch(const char *dev, const char *name, ISState *states,
case IOP_FIND_HOME:
if (firmwareInfo.Model.find("CEM") == std::string::npos &&
firmwareInfo.Model.find("GEM45") == std::string::npos &&
- firmwareInfo.Model.find("HAE") == std::string::npos &&
- firmwareInfo.Model.find("HAZ") == std::string::npos &&
+ firmwareInfo.Model.find("HAE") == std::string::npos &&
+ firmwareInfo.Model.find("HAZ") == std::string::npos &&
firmwareInfo.Model.find("HEM") == std::string::npos)
{
HomeSP.s = IPS_IDLE;
@@ -579,18 +590,25 @@ bool IOptronV3::ISNewSwitch(const char *dev, const char *name, ISState *states,
/*******************************************************
* Meridian Action Operations
*******************************************************/
- if (!strcmp(name, MeridianActionSP.name))
+ if (MeridianActionSP.isNameMatch(name))
{
- IUUpdateSwitch(&MeridianActionSP, states, names, n);
- MeridianActionSP.s = (driver->setMeridianBehavior(static_cast(IUFindOnSwitchIndex(&MeridianActionSP)),
- MeridianLimitN[0].value)) ? IPS_OK : IPS_ALERT;
- if (MeridianActionSP.s == IPS_OK)
+ auto lastAction = MeridianActionSP.findOnSwitchIndex();
+ MeridianActionSP.update(states, names, n);
+
+ if (lastAction != MeridianActionSP.findOnSwitchIndex())
{
- LOGF_INFO("Mount Meridian Behavior: When mount reaches %.f degrees past meridian, it will %s.",
- MeridianLimitN[0].value, MeridianActionS[IOP_MB_STOP].s == ISS_ON ? "stop" : "flip");
+ MeridianActionSP.setState(driver->setMeridianBehavior(static_cast(MeridianActionSP.findOnSwitchIndex()),
+ MeridianLimitNP[0].getValue()) ? IPS_OK : IPS_ALERT);
+ if (MeridianActionSP.getState() == IPS_OK)
+ {
+ LOGF_INFO("Setting mount meridian behavior: When mount reaches %.f degrees past meridian, it will %s.",
+ MeridianLimitNP[0].getValue(), MeridianActionSP[IOP_MB_STOP].getState() == ISS_ON ? "stop" : "flip");
+ }
}
- IDSetSwitch(&MeridianActionSP, nullptr);
- saveConfig(true, MeridianActionSP.name);
+ else
+ MeridianActionSP.setState(IPS_OK);
+ MeridianActionSP.apply();
+ saveConfig(MeridianActionSP);
return true;
}
@@ -1108,8 +1126,8 @@ bool IOptronV3::saveConfigItems(FILE *fp)
IUSaveConfigSwitch(fp, &SlewModeSP);
IUSaveConfigSwitch(fp, &DaylightSP);
- IUSaveConfigSwitch(fp, &MeridianActionSP);
- IUSaveConfigNumber(fp, &MeridianLimitNP);
+ MeridianLimitNP.save(fp);
+ MeridianActionSP.save(fp);
return true;
}
diff --git a/drivers/telescope/ioptronv3.h b/drivers/telescope/ioptronv3.h
index 1d234673d4..9f2d059747 100644
--- a/drivers/telescope/ioptronv3.h
+++ b/drivers/telescope/ioptronv3.h
@@ -151,17 +151,15 @@ class IOptronV3 : public INDI::Telescope, public INDI::GuiderInterface
ISwitchVectorProperty DaylightSP;
// Meridian Behavior
- ISwitch MeridianActionS[2];
- ISwitchVectorProperty MeridianActionSP;
+ INDI::PropertySwitch MeridianActionSP {2};
// Meridian Limit
- INumber MeridianLimitN[1];
- INumberVectorProperty MeridianLimitNP;
+ INDI::PropertyNumber MeridianLimitNP {1};
uint32_t DBG_SCOPE;
- double currentRA, currentDEC;
- double targetRA, targetDEC;
+ double currentRA {0}, currentDEC {0};
+ double targetRA {0}, targetDEC {0};
IOPv3::IOPInfo scopeInfo;
IOPv3::FirmwareInfo firmwareInfo;