Kstars

indifocuser.cpp
1/*
2 SPDX-FileCopyrightText: 2012 Jasem Mutlaq <mutlaqja@ikarustech.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include <basedevice.h>
8#include "indifocuser.h"
9#include "clientmanager.h"
10
11namespace ISD
12{
13
14void Focuser::registerProperty(INDI::Property prop)
15{
16 if (!prop.getRegistered())
17 return;
18
19 if (prop.isNameMatch("FOCUS_MAX"))
20 {
21 auto nvp = prop.getNumber();
22 m_maxPosition = nvp->at(0)->getValue();
23 }
24
25 ConcreteDevice::registerProperty(prop);
26}
27
28void Focuser::processNumber(INDI::Property prop)
29{
30 auto nvp = prop.getNumber();
31 if (prop.isNameMatch("FOCUS_MAX"))
32 {
33 m_maxPosition = nvp->at(0)->getValue();
34 }
35}
36
37bool Focuser::focusIn()
38{
39 auto focusProp = getSwitch("FOCUS_MOTION");
40
41 if (!focusProp)
42 return false;
43
44 auto inFocus = focusProp->findWidgetByName("FOCUS_INWARD");
45
46 if (!inFocus)
47 return false;
48
49 if (inFocus->getState() == ISS_ON)
50 return true;
51
52 focusProp->reset();
53 inFocus->setState(ISS_ON);
54
55 sendNewProperty(focusProp);
56
57 return true;
58}
59
60bool Focuser::stop()
61{
62 auto focusStop = getSwitch("FOCUS_ABORT_MOTION");
63
64 if (!focusStop)
65 return false;
66
67 focusStop->at(0)->setState(ISS_ON);
68 sendNewProperty(focusStop);
69
70 return true;
71}
72
73bool Focuser::focusOut()
74{
75 auto focusProp = getSwitch("FOCUS_MOTION");
76
77 if (!focusProp)
78 return false;
79
80 auto outFocus = focusProp->findWidgetByName("FOCUS_OUTWARD");
81
82 if (!outFocus)
83 return false;
84
85 if (outFocus->getState() == ISS_ON)
86 return true;
87
88 focusProp->reset();
89 outFocus->setState(ISS_ON);
90
91 sendNewProperty(focusProp);
92
93 return true;
94}
95
96bool Focuser::getFocusDirection(ISD::Focuser::FocusDirection *dir)
97{
98 auto focusProp = getSwitch("FOCUS_MOTION");
99
100 if (!focusProp)
101 return false;
102
103 auto inFocus = focusProp->findWidgetByName("FOCUS_INWARD");
104
105 if (!inFocus)
106 return false;
107
108 if (inFocus->getState() == ISS_ON)
109 *dir = FOCUS_INWARD;
110 else
111 *dir = FOCUS_OUTWARD;
112
113 return true;
114}
115
116bool Focuser::moveByTimer(int msecs)
117{
118 auto focusProp = getNumber("FOCUS_TIMER");
119
120 if (!focusProp)
121 return false;
122
123 focusProp->at(0)->setValue(msecs);
124
125 sendNewProperty(focusProp);
126
127 return true;
128}
129
130bool Focuser::moveAbs(int steps)
131{
132 auto focusProp = getNumber("ABS_FOCUS_POSITION");
133
134 if (!focusProp)
135 return false;
136
137 focusProp->at(0)->setValue(steps);
138
139 sendNewProperty(focusProp);
140
141 return true;
142}
143
144bool Focuser::canAbsMove()
145{
146 auto focusProp = getNumber("ABS_FOCUS_POSITION");
147
148 if (!focusProp)
149 return false;
150 else
151 return true;
152}
153
154bool Focuser::moveRel(int steps)
155{
156 if(canManualFocusDriveMove())
157 {
158 auto focusProp = getNumber("manualfocusdrive");
159
160 FocusDirection dir;
161 if (!getFocusDirection(&dir))
162 return false;
163 if (dir == FOCUS_INWARD)
164 steps = -abs(steps);
165 else if (dir == FOCUS_OUTWARD)
166 steps = abs(steps);
167
168 //manualfocusdrive needs different steps value ​​at every turn
169 if (steps == getLastManualFocusDriveValue())
170 steps += 1;
171
172 //Nikon Z6 fails if step is -1, 0, 1
173 if (deviation == NIKONZ6)
174 {
175 if (abs(steps) < 2)
176 steps = 2;
177 }
178
179 focusProp[0].setValue(steps);
180 sendNewProperty(focusProp);
181 return true;
182 }
183 else
184 {
185 auto focusProp = getNumber("REL_FOCUS_POSITION");
186 focusProp[0].setValue(steps);
187 sendNewProperty(focusProp);
188 return true;
189 }
190
191 return false;
192}
193
194bool Focuser::canRelMove()
195{
196 auto focusProp = getNumber("REL_FOCUS_POSITION");
197
198 if (!focusProp)
199 return false;
200 else
201 return true;
202}
203
204bool Focuser::canManualFocusDriveMove()
205{
206 auto focusProp = getNumber("manualfocusdrive");
207
208 if (!focusProp)
209 return false;
210 else
211 return true;
212}
213
214double Focuser::getLastManualFocusDriveValue()
215{
216 auto focusProp = getNumber("manualfocusdrive");
217
218 if (!focusProp)
219 return 0;
220
221 return focusProp->at(0)->getValue();
222}
223
224
225bool Focuser::canTimerMove()
226{
227 auto focusProp = getNumber("FOCUS_TIMER");
228
229 if (!focusProp)
230 return false;
231 else
232 return true;
233}
234
235bool Focuser::setMaxPosition(uint32_t steps)
236{
237 auto focusProp = getNumber("FOCUS_MAX");
238
239 if (!focusProp)
240 return false;
241
242 focusProp->at(0)->setValue(steps);
243 sendNewProperty(focusProp);
244
245 return true;
246}
247
248bool Focuser::hasBacklash()
249{
250 auto focusProp = getNumber("FOCUS_BACKLASH_STEPS");
251 return (focusProp != nullptr);
252}
253
254bool Focuser::setBacklash(int32_t steps)
255{
256 auto focusToggle = getSwitch("FOCUS_BACKLASH_TOGGLE");
257 if (!focusToggle)
258 return false;
259
260 // Make sure focus compensation is enabled.
261 if (steps != 0 && focusToggle->at(0)->getState() != ISS_ON)
262 {
263 focusToggle->reset();
264 focusToggle->at(0)->setState(ISS_ON);
265 focusToggle->at(1)->setState(ISS_OFF);
266 sendNewProperty(focusToggle);
267 }
268
269 auto focusProp = getNumber("FOCUS_BACKLASH_STEPS");
270 if (!focusProp)
271 return false;
272
273 focusProp->at(0)->setValue(steps);
274 sendNewProperty(focusProp);
275
276 // If steps = 0, disable compensation
277 if (steps == 0 && focusToggle->at(0)->getState() == ISS_ON)
278 {
279 focusToggle->reset();
280 focusToggle->at(0)->setState(ISS_OFF);
281 focusToggle->at(1)->setState(ISS_ON);
282 sendNewProperty(focusToggle);
283 }
284 return true;
285}
286
287int32_t Focuser::getBacklash()
288{
289 auto focusProp = getNumber("FOCUS_BACKLASH_STEPS");
290 if (!focusProp)
291 return -1;
292
293 return focusProp->at(0)->getValue();
294}
295
296bool Focuser::hasDeviation()
297{
298 if (getDeviceName() == "Nikon DSLR Z6")
299 {
300 deviation = NIKONZ6;
301 return true;
302 }
303 return false;
304}
305
306}
void sendNewProperty(INDI::Property prop)
Send new property command to server.
INDI::PropertySwitch getSwitch(const QString &name) const
ISD is a collection of INDI Standard Devices.
KIOCORE_EXPORT QString dir(const QString &fileClass)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 11:58:37 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.