forked from indilib/indi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
focuslynxbase.h
234 lines (183 loc) · 7.15 KB
/
focuslynxbase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/*
Focus Lynx INDI driver
Copyright (C) 2015 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
*/
#pragma once
#include "indifocuser.h"
#include <indifocuser.h>
#include <indicom.h>
#include "connectionplugins/connectionserial.h"
#include "connectionplugins/connectiontcp.h"
#include <map>
#include <stdint.h>
#include <termios.h>
#include <unistd.h>
#include <memory>
#include <cmath>
#include <cstring>
#define LYNXFOCUS_MAX_RETRIES 1
#define LYNXFOCUS_TIMEOUT 3
#define LYNXFOCUS_MAXBUF 16
#define LYNXFOCUS_TEMPERATURE_FREQ 20 /* Update every 20 POLLMS cycles. For POLLMS 500ms = 10 seconds freq */
#define LYNXFOCUS_POSITION_THRESHOLD 5 /* Only send position updates to client if the diff exceeds 5 steps */
#define FOCUS_SETTINGS_TAB "Settings"
#define FOCUS_STATUS_TAB "Status"
#define HUB_SETTINGS_TAB "Device"
#define VERSION 1
#define SUBVERSION 46
class FocusLynxBase : public INDI::Focuser
{
public:
FocusLynxBase();
FocusLynxBase(const char *target);
enum
{
FOCUS_A_COEFF,
FOCUS_B_COEFF,
FOCUS_C_COEFF,
FOCUS_D_COEFF,
FOCUS_E_COEFF,
FOCUS_F_COEFF
};
typedef enum
{
STATUS_MOVING,
STATUS_HOMING,
STATUS_HOMED,
STATUS_FFDETECT,
STATUS_TMPPROBE,
STATUS_REMOTEIO,
STATUS_HNDCTRL,
STATUS_REVERSE,
STATUS_UNKNOWN
} LYNX_STATUS;
enum
{
GOTO_CENTER,
GOTO_HOME
};
virtual bool Handshake() override;
virtual const char *getDefaultName() override;
virtual bool initProperties() override;
virtual void ISGetProperties(const char *dev) override;
virtual bool updateProperties() override;
virtual bool saveConfigItems(FILE *fp) override;
virtual bool loadConfig(bool silent, const char *property) override;
virtual bool ISNewNumber(const char *dev, const char *name, double values[], char *names[], int n) override;
virtual bool ISNewSwitch(const char *dev, const char *name, ISState *states, char *names[], int n) override;
virtual bool ISNewText(const char *dev, const char *name, char *texts[], char *names[], int n) override;
virtual IPState MoveAbsFocuser(uint32_t targetPosition) override;
virtual IPState MoveRelFocuser(FocusDirection dir, uint32_t ticks) override;
virtual IPState MoveFocuser(FocusDirection dir, int speed, uint16_t duration) override;
virtual bool AbortFocuser() override;
virtual void TimerHit() override;
virtual int getVersion(int *major, int *minor, int *sub);
void setFocusTarget(const char *target);
const char *getFocusTarget();
virtual void debugTriggered(bool enable) override;
// Device
bool setDeviceType(int index);
uint32_t DBG_FOCUS;
// Misc functions
bool ack();
bool isResponseOK();
protected:
virtual bool SetFocuserMaxPosition(uint32_t ticks) override;
virtual bool ReverseFocuser(bool enabled) override;
virtual bool SyncFocuser(uint32_t ticks) override;
virtual bool SetFocuserBacklash(int32_t steps) override;
virtual bool SetFocuserBacklashEnabled(bool enabled) override;
// Move from private to public to validate
bool configurationComplete;
// List all supported models
ISwitch *ModelS;
ISwitchVectorProperty ModelSP;
// Led Intensity Value
INumber LedN[1];
INumberVectorProperty LedNP;
// Store version of the firmware from the HUB
char version[16];
private:
uint32_t simPosition;
uint32_t targetPosition;
ISState simStatus[8];
bool simCompensationOn;
char focusTarget[8];
std::map<std::string, std::string> lynxModels;
struct timeval focusMoveStart;
float focusMoveRequest;
// Get functions
bool getFocusConfig();
bool getFocusStatus();
bool getFocusTemp();
// Set functions
// Position
bool setStepSize(uint16_t stepsize);
// Temperature
bool setTemperatureCompensation(bool enable);
bool setTemperatureCompensationMode(char mode);
bool setTemperatureCompensationCoeff(char mode, int16_t coeff);
bool setTemperatureInceptions(char mode, int32_t inter);
bool setTemperatureCompensationOnStart(bool enable);
// Motion functions
bool stop();
bool home();
bool center();
// Led level
bool setLedLevel(int level);
// Device Nickname
bool setDeviceNickname(const char *nickname);
// Misc functions
bool resetFactory();
float calcTimeLeft(timeval, float);
// Properties
// Set/Get Temperature
INumber TemperatureN[1];
INumberVectorProperty TemperatureNP;
// Enable/Disable temperature compensation
ISwitch TemperatureCompensateS[2];
ISwitchVectorProperty TemperatureCompensateSP;
// Enable/Disable temperature compensation on start
ISwitch TemperatureCompensateOnStartS[2];
ISwitchVectorProperty TemperatureCompensateOnStartSP;
// Temperature Coefficient Mode
ISwitch TemperatureCompensateModeS[5];
ISwitchVectorProperty TemperatureCompensateModeSP;
// Temperature coefficient and Intercept for selected mode
INumber TemperatureParamN[2];
INumberVectorProperty TemperatureParamNP;
// Reset to Factory setting
ISwitch ResetS[1];
ISwitchVectorProperty ResetSP;
// Go to home/center
ISwitch GotoS[2];
ISwitchVectorProperty GotoSP;
// Status indicators
ILight StatusL[8];
ILightVectorProperty StatusLP;
// Max Travel for relative focusers
// INumber MaxTravelN[1];
// INumberVectorProperty MaxTravelNP;
// Focuser Step Size
INumber StepSizeN[1];
INumberVectorProperty StepSizeNP;
// Focus name configure in the HUB
IText HFocusNameT[1] {};
ITextVectorProperty HFocusNameTP;
bool canHome;
bool isHoming;
// TODO add property for this.
bool m_HomeOnStart {false};
static const uint8_t LYNX_MAX { 64 };
};