Instrument Neutral Distributed Interface INDI  1.9.5
simplescope.cpp
Go to the documentation of this file.
1 /*
2  INDI Developers Manual
3  Tutorial #2
4 
5  "Simple Telescope Driver"
6 
7  We develop a simple telescope simulator.
8 
9  Refer to README, which contains instruction on how to build this driver, and use it
10  with an INDI-compatible client.
11 
12 */
13 
22 #include "simplescope.h"
23 
24 #include "indicom.h"
25 
26 #include <cmath>
27 #include <memory>
28 
29 static std::unique_ptr<SimpleScope> simpleScope(new SimpleScope());
30 
32 {
33  // We add an additional debug level so we can log verbose scope status
34  DBG_SCOPE = INDI::Logger::getInstance().addDebugLevel("Scope Verbose", "SCOPE");
35 }
36 
37 /**************************************************************************************
38 ** We init our properties here. The only thing we want to init are the Debug controls
39 ***************************************************************************************/
41 {
42  // ALWAYS call initProperties() of parent first
44 
45  // Add Debug control so end user can turn debugging/loggin on and off
47 
48  // Enable simulation mode so that serial connection in INDI::Telescope does not try
49  // to attempt to perform a physical connection to the serial port.
50  setSimulation(true);
51 
52  // Set telescope capabilities. 0 is for the the number of slew rates that we support. We have none for this simple driver.
54 
55  return true;
56 }
57 
58 /**************************************************************************************
59 ** INDI is asking us to check communication with the device via a handshake
60 ***************************************************************************************/
62 {
63  // When communicating with a real mount, we check here if commands are receieved
64  // and acknolowedged by the mount. For SimpleScope, we simply return true.
65  return true;
66 }
67 
68 /**************************************************************************************
69 ** INDI is asking us for our default device name
70 ***************************************************************************************/
72 {
73  return "Simple Scope";
74 }
75 
76 /**************************************************************************************
77 ** Client is asking us to slew to a new position
78 ***************************************************************************************/
79 bool SimpleScope::Goto(double ra, double dec)
80 {
81  targetRA = ra;
82  targetDEC = dec;
83  char RAStr[64]={0}, DecStr[64]={0};
84 
85  // Parse the RA/DEC into strings
86  fs_sexa(RAStr, targetRA, 2, 3600);
87  fs_sexa(DecStr, targetDEC, 2, 3600);
88 
89  // Mark state as slewing
91 
92  // Inform client we are slewing to a new position
93  LOGF_INFO("Slewing to RA: %s - DEC: %s", RAStr, DecStr);
94 
95  // Success!
96  return true;
97 }
98 
99 /**************************************************************************************
100 ** Client is asking us to abort our motion
101 ***************************************************************************************/
103 {
104  return true;
105 }
106 
107 /**************************************************************************************
108 ** Client is asking us to report telescope status
109 ***************************************************************************************/
111 {
112  static struct timeval ltv { 0, 0 };
113  struct timeval tv { 0, 0 };
114  double dt = 0, da_ra = 0, da_dec = 0, dx = 0, dy = 0;
115  int nlocked;
116 
117  /* update elapsed time since last poll, don't presume exactly POLLMS */
118  gettimeofday(&tv, nullptr);
119 
120  if (ltv.tv_sec == 0 && ltv.tv_usec == 0)
121  ltv = tv;
122 
123  dt = tv.tv_sec - ltv.tv_sec + (tv.tv_usec - ltv.tv_usec) / 1e6;
124  ltv = tv;
125 
126  // Calculate how much we moved since last time
127  da_ra = SLEW_RATE * dt;
128  da_dec = SLEW_RATE * dt;
129 
130  /* Process per current state. We check the state of EQUATORIAL_EOD_COORDS_REQUEST and act acoordingly */
131  switch (TrackState)
132  {
133  case SCOPE_SLEWING:
134  // Wait until we are "locked" into positon for both RA & DEC axis
135  nlocked = 0;
136 
137  // Calculate diff in RA
138  dx = targetRA - currentRA;
139 
140  // If diff is very small, i.e. smaller than how much we changed since last time, then we reached target RA.
141  if (fabs(dx) * 15. <= da_ra)
142  {
143  currentRA = targetRA;
144  nlocked++;
145  }
146  // Otherwise, increase RA
147  else if (dx > 0)
148  currentRA += da_ra / 15.;
149  // Otherwise, decrease RA
150  else
151  currentRA -= da_ra / 15.;
152 
153  // Calculate diff in DEC
154  dy = targetDEC - currentDEC;
155 
156  // If diff is very small, i.e. smaller than how much we changed since last time, then we reached target DEC.
157  if (fabs(dy) <= da_dec)
158  {
159  currentDEC = targetDEC;
160  nlocked++;
161  }
162  // Otherwise, increase DEC
163  else if (dy > 0)
164  currentDEC += da_dec;
165  // Otherwise, decrease DEC
166  else
167  currentDEC -= da_dec;
168 
169  // Let's check if we recahed position for both RA/DEC
170  if (nlocked == 2)
171  {
172  // Let's set state to TRACKING
174 
175  LOG_INFO("Telescope slew is complete. Tracking...");
176  }
177  break;
178 
179  default:
180  break;
181  }
182 
183  char RAStr[64]={0}, DecStr[64]={0};
184 
185  // Parse the RA/DEC into strings
186  fs_sexa(RAStr, currentRA, 2, 3600);
187  fs_sexa(DecStr, currentDEC, 2, 3600);
188 
189  DEBUGF(DBG_SCOPE, "Current RA: %s Current DEC: %s", RAStr, DecStr);
190 
191  NewRaDec(currentRA, currentDEC);
192  return true;
193 }
INDI::Logger::getInstance
static Logger & getInstance()
Method to get a reference to the object (i.e., Singleton) It is a static method.
Definition: indilogger.cpp:354
INDI::Telescope::initProperties
virtual bool initProperties() override
Called to initialize basic properties required all the time.
Definition: inditelescope.cpp:82
INDI::Telescope::SCOPE_SLEWING
@ SCOPE_SLEWING
Definition: inditelescope.h:76
simplescope.h
Construct a basic INDI telescope device that simulates GOTO commands.
indicom.h
Implementations for common driver routines.
INDI::Telescope::NewRaDec
void NewRaDec(double ra, double dec)
The child class calls this function when it has updates.
Definition: inditelescope.cpp:693
SimpleScope::SimpleScope
SimpleScope()
Definition: simplescope.cpp:31
SimpleScope::Handshake
bool Handshake() override
perform handshake with device to check communication
Definition: simplescope.cpp:61
LOG_INFO
#define LOG_INFO(txt)
Definition: indilogger.h:74
SimpleScope::Goto
bool Goto(double, double) override
Move the scope to the supplied RA and DEC coordinates.
Definition: simplescope.cpp:79
INDI::Telescope::TrackState
TelescopeStatus TrackState
Definition: inditelescope.h:693
ra
double ra
Definition: ieqprolegacydriver.cpp:43
INDI::Telescope::SetTelescopeCapability
void SetTelescopeCapability(uint32_t cap, uint8_t slewRateCount=0)
SetTelescopeCapability sets the Telescope capabilities. All capabilities must be initialized.
Definition: inditelescope.cpp:1818
SimpleScope::Abort
bool Abort() override
Abort any telescope motion including tracking if possible.
Definition: simplescope.cpp:102
INDI::Telescope::TELESCOPE_CAN_ABORT
@ TELESCOPE_CAN_ABORT
Definition: inditelescope.h:162
dec
double dec
Definition: ieqprolegacydriver.cpp:44
INDI::DefaultDevice::setSimulation
void setSimulation(bool enable)
Toggle driver simulation status A driver can run in simulation mode if Simulation option is enabled b...
Definition: defaultdevice.cpp:703
INDI::Telescope::SCOPE_TRACKING
@ SCOPE_TRACKING
Definition: inditelescope.h:77
LOGF_INFO
#define LOGF_INFO(fmt,...)
Definition: indilogger.h:82
INDI::Telescope::TELESCOPE_CAN_GOTO
@ TELESCOPE_CAN_GOTO
Definition: inditelescope.h:159
SimpleScope::ReadScopeStatus
bool ReadScopeStatus() override
Read telescope status.
Definition: simplescope.cpp:110
INDI::Logger::addDebugLevel
int addDebugLevel(const char *debugLevelName, const char *LoggingLevelName)
Adds a new debugging level to the driver.
Definition: indilogger.cpp:87
DEBUGF
#define DEBUGF(priority, msg,...)
Definition: indilogger.h:57
currentRA
#define currentRA
Definition: ieq45.cpp:47
fs_sexa
int fs_sexa(char *out, double a, int w, int fracbase)
Converts a sexagesimal number to a string.
Definition: indicom.c:137
SimpleScope::getDefaultName
const char * getDefaultName() override
Definition: simplescope.cpp:71
INDI::DefaultDevice::addDebugControl
void addDebugControl()
Add Debug control to the driver.
Definition: defaultdevice.cpp:639
SimpleScope::initProperties
bool initProperties() override
Called to initialize basic properties required all the time.
Definition: simplescope.cpp:40
currentDEC
#define currentDEC
Definition: ieq45.cpp:48
SimpleScope
Definition: simplescope.h:26