9 #include <libnova/sidereal_time.h>
10 #include <libnova/transform.h>
19 #include <gtest/gtest.h>
20 #include <gmock/gmock.h>
23 using ::testing::StrEq;
25 char _me[] =
"MockEQ500XDriver";
69 LST = 0.0 + lng / 15.0;
113 TEST(EQ500XDriverTest, test_LSTSync)
123 ASSERT_DOUBLE_EQ( +0.0, p.
RAsky());
124 ASSERT_DOUBLE_EQ( +90.0, p.
DECsky());
128 ASSERT_DOUBLE_EQ( 23.0, p.
RAsky());
129 ASSERT_DOUBLE_EQ( +90.0, p.
DECsky());
133 ASSERT_DOUBLE_EQ( 23.0, p.
RAsky());
134 ASSERT_DOUBLE_EQ( +90.0, p.
DECsky());
137 TEST(EQ500XDriverTest, test_MechanicalPoint_Equality)
148 ASSERT_FALSE(p != q);
150 ASSERT_FALSE(p == q);
153 q.
RAm(q.
RAm() + 15.0 / 3600.0);
154 ASSERT_FALSE(p == q);
156 q.
RAm(q.
RAm() - 15.0 / 3600.0);
158 ASSERT_FALSE(p != q);
160 ASSERT_FALSE(p == q);
164 ASSERT_FALSE(p != q);
167 TEST(EQ500XDriverTest, test_MechanicalPoint_RA_distance)
171 ASSERT_EQ( 0.0, p.
RAsky(0.0));
172 ASSERT_EQ( 1.0, q.
RAsky(1.0));
176 ASSERT_EQ( 2.0, q.
RAsky(2.0));
180 ASSERT_EQ( 8.0, q.
RAsky(8.0));
184 ASSERT_EQ( 12.0, q.
RAsky(12.0));
188 ASSERT_EQ( 18.0, q.
RAsky(18.0));
193 TEST(EQ500XDriverTest, test_MechanicalPoint_PierFlip)
202 ASSERT_DOUBLE_EQ( 0.0, p.
RAsky ( +0.0));
203 ASSERT_DOUBLE_EQ(+90.0, p.
DECsky(+90.0));
204 ASSERT_FALSE(strncmp(
"12:00:00", p.
toStringRA (b, 64), 64));
205 ASSERT_FALSE(strncmp(
"+00:00:00", p.
toStringDEC(b, 64), 64));
207 ASSERT_DOUBLE_EQ( 0.0, p.
RAsky ( +0.0));
208 ASSERT_DOUBLE_EQ(+90.0, p.
DECsky(+90.0));
209 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA (b, 64), 64));
210 ASSERT_FALSE(strncmp(
"+00:00:00", p.
toStringDEC(b, 64), 64));
213 ASSERT_DOUBLE_EQ( 0.0, p.
RAsky ( +0.0));
214 ASSERT_DOUBLE_EQ(+80.0, p.
DECsky(+80.0));
215 ASSERT_FALSE(strncmp(
"12:00:00", p.
toStringRA (b, 64), 64));
216 ASSERT_FALSE(strncmp(
"-10:00:00", p.
toStringDEC(b, 64), 64));
218 ASSERT_DOUBLE_EQ( 0.0, p.
RAsky ( +0.0));
219 ASSERT_DOUBLE_EQ(+80.0, p.
DECsky(+80.0));
220 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA (b, 64), 64));
221 ASSERT_FALSE(strncmp(
"+10:00:00", p.
toStringDEC(b, 64), 64));
224 ASSERT_DOUBLE_EQ( 0.0, p.
RAsky ( +0.0));
225 ASSERT_DOUBLE_EQ(+70.0, p.
DECsky(+70.0));
226 ASSERT_FALSE(strncmp(
"12:00:00", p.
toStringRA (b, 64), 64));
227 ASSERT_FALSE(strncmp(
"-20:00:00", p.
toStringDEC(b, 64), 64));
229 ASSERT_DOUBLE_EQ( 0.0, p.
RAsky ( +0.0));
230 ASSERT_DOUBLE_EQ(+70.0, p.
DECsky(+70.0));
231 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA (b, 64), 64));
232 ASSERT_FALSE(strncmp(
"+20:00:00", p.
toStringDEC(b, 64), 64));
235 TEST(EQ500XDriverTest, test_Stability_RA_Conversions)
238 for (
size_t ps = 0; ps <
sizeof(sides) /
sizeof(sides[0]); ps++)
240 for (
int s = 0; s < 60; s++)
242 for (
int m = 0; m < 60; m++)
244 for (
int h = 0; h < 24; h++)
248 char b[64] = {0}, c[64] = {0};
252 snprintf(b,
sizeof(b),
"%02d:%02d:%02d", h, m, s);
256 ASSERT_FALSE(strncmp(b, c,
sizeof(b)));
263 TEST(EQ500XDriverTest, test_Stability_DEC_Conversions)
267 for (
size_t ps = 0; ps <
sizeof(sides) /
sizeof(sides[0]); ps++)
269 for (
int s = 0; s < 60; s++)
271 for (
int m = 0; m < 60; m++)
273 for (
int d = -89; d <= +89; d++)
277 char b[64] = {0}, c[64] = {0};
281 snprintf(b,
sizeof(b),
"%+03d:%02d:%02d", d, m, s);
286 if (strncmp(b, c,
sizeof(b)))
292 ASSERT_FALSE(strncmp(b, c,
sizeof(b)));
299 TEST(EQ500XDriverTest, test_NormalPointing_RA_Conversions)
307 ASSERT_DOUBLE_EQ( +0.0, p.
RAsky());
308 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA(b, 64), 64));
311 ASSERT_DOUBLE_EQ( +6.0, p.
RAsky());
312 ASSERT_FALSE(strncmp(
"06:00:00", p.
toStringRA(b, 64), 64));
315 ASSERT_DOUBLE_EQ(+12.0, p.
RAsky());
316 ASSERT_FALSE(strncmp(
"12:00:00", p.
toStringRA(b, 64), 64));
319 ASSERT_DOUBLE_EQ(+18.0, p.
RAsky());
320 ASSERT_FALSE(strncmp(
"18:00:00", p.
toStringRA(b, 64), 64));
323 ASSERT_DOUBLE_EQ( +0.0, p.
RAsky());
324 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA(b, 64), 64));
327 ASSERT_NEAR(1 / 3600.0, p.
RAsky(), 1 / 3600.0);
328 ASSERT_FALSE(strncmp(
"00:00:01", p.
toStringRA(b, 64), 64));
331 ASSERT_NEAR(1 / 60.0, p.
RAsky(), 1 / 3600.0);
332 ASSERT_FALSE(strncmp(
"00:01:00", p.
toStringRA(b, 64), 64));
335 TEST(EQ500XDriverTest, test_BeyondPolePointing_RA_Conversions)
343 ASSERT_EQ(+12.0, p.
RAsky());
344 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA(b, 64), 64));
347 ASSERT_EQ(+18.0, p.
RAsky());
348 ASSERT_FALSE(strncmp(
"06:00:00", p.
toStringRA(b, 64), 64));
351 ASSERT_EQ( +0.0, p.
RAsky());
352 ASSERT_FALSE(strncmp(
"12:00:00", p.
toStringRA(b, 64), 64));
355 ASSERT_EQ( +6.0, p.
RAsky());
356 ASSERT_FALSE(strncmp(
"18:00:00", p.
toStringRA(b, 64), 64));
359 ASSERT_EQ(+12.0, p.
RAsky());
360 ASSERT_FALSE(strncmp(
"00:00:00", p.
toStringRA(b, 64), 64));
390 TEST(EQ500XDriverTest, test_MechanicalPoint_Sky_DEC_Conversion)
394 ASSERT_EQ(-255.0, p.
DECm(-255.0));
396 ASSERT_EQ( -15.0, p.
DECsky());
397 ASSERT_EQ( -15.0, p.
DECsky( -15.0));
398 ASSERT_EQ(+105.0, p.
DECm());
400 ASSERT_EQ(-225.0, p.
DECm(-225.0));
402 ASSERT_EQ( -45.0, p.
DECsky());
403 ASSERT_EQ( -45.0, p.
DECsky( -45.0));
404 ASSERT_EQ(+135.0, p.
DECm());
406 ASSERT_EQ(-180.0, p.
DECm(-180.0));
408 ASSERT_EQ( -90.0, p.
DECsky());
409 ASSERT_EQ( -90.0, p.
DECsky( -90.0));
410 ASSERT_EQ(-180.0, p.
DECm());
412 ASSERT_EQ(-135.0, p.
DECm(-135.0));
414 ASSERT_EQ( -45.0, p.
DECsky());
415 ASSERT_EQ( -45.0, p.
DECsky( -45.0));
416 ASSERT_EQ(-135.0, p.
DECm());
418 ASSERT_EQ( -90.0, p.
DECm( -90.0));
420 ASSERT_EQ( +0.0, p.
DECsky());
421 ASSERT_EQ( +0.0, p.
DECsky( +0.0));
422 ASSERT_EQ( -90.0, p.
DECm());
424 ASSERT_EQ( -45.0, p.
DECm( -45.0));
426 ASSERT_EQ( +45.0, p.
DECsky());
427 ASSERT_EQ( +45.0, p.
DECsky( +45.0));
428 ASSERT_EQ( -45.0, p.
DECm());
430 ASSERT_EQ( +0.0, p.
DECm( +0.0));
432 ASSERT_EQ( +90.0, p.
DECsky());
433 ASSERT_EQ( +90.0, p.
DECsky( +90.0));
434 ASSERT_EQ( +0.0, p.
DECm());
436 ASSERT_EQ( +45.0, p.
DECm( +45.0));
438 ASSERT_EQ( +45.0, p.
DECsky());
439 ASSERT_EQ( +45.0, p.
DECsky( +45.0));
440 ASSERT_EQ( +45.0, p.
DECm());
442 ASSERT_EQ( +90.0, p.
DECm( +90.0));
444 ASSERT_EQ( +0.0, p.
DECsky());
445 ASSERT_EQ( +0.0, p.
DECsky( +0.0));
446 ASSERT_EQ( +90.0, p.
DECm());
448 ASSERT_EQ(+135.0, p.
DECm(+135.0));
450 ASSERT_EQ( -45.0, p.
DECsky());
451 ASSERT_EQ( -45.0, p.
DECsky( -45.0));
452 ASSERT_EQ(+135.0, p.
DECm());
454 ASSERT_EQ(+180.0, p.
DECm(+180.0));
456 ASSERT_EQ( -90.0, p.
DECsky());
457 ASSERT_EQ( -90.0, p.
DECsky( -90.0));
458 ASSERT_EQ(+180.0, p.
DECm());
460 ASSERT_EQ(+225.0, p.
DECm(+225.0));
462 ASSERT_EQ( -45.0, p.
DECsky());
463 ASSERT_EQ( -45.0, p.
DECsky( -45.0));
464 ASSERT_EQ(-135.0, p.
DECm());
466 ASSERT_EQ(+255.0, p.
DECm(+255.0));
468 ASSERT_EQ( -15.0, p.
DECsky());
469 ASSERT_EQ( -15.0, p.
DECsky( -15.0));
470 ASSERT_EQ(-105.0, p.
DECm());
473 TEST(EQ500XDriverTest, test_DEC_Conversions)
479 ASSERT_EQ(-255.0, p.
DECm());
481 ASSERT_FALSE(strncmp(
"-255:00:00", p.
toStringDEC(b, 64), 64));
485 ASSERT_EQ(-225.0, p.
DECm());
487 ASSERT_FALSE(strncmp(
"-225:00:00", p.
toStringDEC(b, 64), 64));
491 ASSERT_EQ(-180.0, p.
DECm());
493 ASSERT_FALSE(strncmp(
"-180:00:00", p.
toStringDEC(b, 64), 64));
497 ASSERT_EQ(-135.0, p.
DECm());
499 ASSERT_FALSE(strncmp(
"-135:00:00", p.
toStringDEC(b, 64), 64));
503 ASSERT_EQ( -90.0, p.
DECm());
505 ASSERT_FALSE(strncmp(
"-90:00:00", p.
toStringDEC(b, 64), 64));
509 ASSERT_EQ( -45.0, p.
DECm());
511 ASSERT_FALSE(strncmp(
"-45:00:00", p.
toStringDEC(b, 64), 64));
515 ASSERT_EQ( +0.0, p.
DECm());
517 ASSERT_FALSE(strncmp(
"+00:00:00", p.
toStringDEC(b, 64), 64));
521 ASSERT_EQ( +45.0, p.
DECm());
523 ASSERT_FALSE(strncmp(
"+45:00:00", p.
toStringDEC(b, 64), 64));
527 ASSERT_EQ( +90.0, p.
DECm());
529 ASSERT_FALSE(strncmp(
"+90:00:00", p.
toStringDEC(b, 64), 64));
533 ASSERT_EQ(+135.0, p.
DECm());
535 ASSERT_FALSE(strncmp(
"+135:00:00", p.
toStringDEC(b, 64), 64));
539 ASSERT_EQ(+180.0, p.
DECm());
541 ASSERT_FALSE(strncmp(
"+180:00:00", p.
toStringDEC(b, 64), 64));
545 ASSERT_EQ(+225.0, p.
DECm());
547 ASSERT_FALSE(strncmp(
"+225:00:00", p.
toStringDEC(b, 64), 64));
551 ASSERT_EQ(+255.0, p.
DECm());
553 ASSERT_FALSE(strncmp(
"+255:00:00", p.
toStringDEC(b, 64), 64));
558 ASSERT_NEAR(+1 / 3600.0, p.
DECm(), 1 / 3600.0);
559 ASSERT_FALSE(strncmp(
"+00:00:01", p.
toStringDEC(b, 64), 64));
563 ASSERT_NEAR(+1 / 60.0, p.
DECm(), 1 / 3600.0);
564 ASSERT_FALSE(strncmp(
"+00:01:00", p.
toStringDEC(b, 64), 64));
569 ASSERT_NEAR(-1 / 3600.0, p.
DECm(), 1 / 3600.0);
570 ASSERT_FALSE(strncmp(
"+00:00:01", p.
toStringDEC(b, 64), 64));
574 ASSERT_NEAR(-1 / 60.0, p.
DECm(), 1 / 3600.0);
575 ASSERT_FALSE(strncmp(
"+00:01:00", p.
toStringDEC(b, 64), 64));
583 TEST(EQ500XDriverTest, test_Sync)
591 ASSERT_EQ(0.0, p.
RAm());
592 ASSERT_EQ(0.0, p.
DECm());
593 ASSERT_EQ(0.0, p.
RAsky());
594 ASSERT_EQ(90.0, p.
DECsky());
599 ASSERT_EQ(0.0, p.
RAm());
600 ASSERT_EQ(90.0, p.
DECm());
601 ASSERT_EQ(0.0, p.
RAsky());
602 ASSERT_EQ(0.0, p.
DECsky());
607 ASSERT_EQ(10.0, p.
RAm());
608 ASSERT_EQ(90.0, p.
DECm());
609 ASSERT_EQ(10.0, p.
RAsky());
610 ASSERT_EQ(0.0, p.
DECsky());
615 ASSERT_EQ(14.0, p.
RAm());
616 ASSERT_EQ(90.0, p.
DECm());
617 ASSERT_EQ(14.0, p.
RAsky());
618 ASSERT_EQ(0.0, p.
DECsky());
623 ASSERT_EQ(0.0, p.
RAm());
624 ASSERT_EQ(80.0, p.
DECm());
625 ASSERT_EQ(0.0, p.
RAsky());
626 ASSERT_EQ(10.0, p.
DECsky());
631 ASSERT_EQ(0.0, p.
RAm());
632 ASSERT_EQ(100.0, p.
DECm());
633 ASSERT_EQ(0.0, p.
RAsky());
634 ASSERT_EQ(-10.0, p.
DECsky());
639 ASSERT_EQ(14.0, p.
RAm());
640 ASSERT_EQ(100.0, p.
DECm());
641 ASSERT_EQ(14.0, p.
RAsky());
642 ASSERT_EQ(-10.0, p.
DECsky());
646 TEST(EQ500XDriverTest, test_Goto_NoMovement)
649 struct timespec timeout = {0, 100000000L};
656 for(
int i = 0; i < 10; i++)
658 nanosleep(&timeout,
nullptr);
667 TEST(EQ500XDriverTest, test_Goto_AbortMovement)
675 for(
int i = 0; i < 4; i++)
679 nanosleep(&timeout,
nullptr);
689 TEST(EQ500XDriverTest, test_Goto_SouthMovement)
698 for(
int i = 0; i < 150; i++)
702 nanosleep(&timeout,
nullptr);
711 TEST(EQ500XDriverTest, test_Goto_NorthMovement)
720 for(
int i = 0; i < 150; i++)
724 nanosleep(&timeout,
nullptr);
733 TEST(EQ500XDriverTest, test_Goto_EastMovement)
742 for(
int i = 0; i < 150; i++)
746 nanosleep(&timeout,
nullptr);
755 TEST(EQ500XDriverTest, test_Goto_WestMovement)
764 for(
int i = 0; i < 150; i++)
768 nanosleep(&timeout,
nullptr);
777 TEST(EQ500XDriverTest, test_RestoreSlewRateOnAbort)
788 nanosleep(&timeout,
nullptr);
796 TEST(EQ500XDriverTest, test_RestoreSlewRateAfterGoto)
805 for(
int i = 0; i < 150; i++)
809 nanosleep(&timeout,
nullptr);
820 TEST(EQ500XDriverTest, test_RestoreSlewRateAfterInterruptingGoto)
829 for(
int i = 0; i < 30; i++)
833 nanosleep(&timeout,
nullptr);
838 for(
int i = 0; i < 150; i++)
842 nanosleep(&timeout,
nullptr);
853 int main(
int argc,
char **argv)
858 ::testing::InitGoogleTest(&argc, argv);
859 ::testing::InitGoogleMock(&argc, argv);
860 return RUN_ALL_TESTS();
enum PointingState setPointingState(enum PointingState)
char const * toStringDEC_Sim(char *, size_t) const
enum PointingState getPointingState() const
bool parseStringRA(char const *, size_t)
double RA_degrees_to(MechanicalPoint const &) const
char const * toStringDEC(char *, size_t) const
bool parseStringDEC(char const *, size_t)
char const * toStringRA(char *, size_t) const
virtual bool updateLocation(double, double, double) override
Update telescope location settings.
virtual bool checkConnection() override
virtual bool Goto(double, double) override
Move the scope to the supplied RA and DEC coordinates.
virtual bool ReadScopeStatus() override
Read telescope status.
virtual bool Sync(double, double) override
Set the telescope current RA and DEC coordinates to the supplied RA and DEC coordinates.
bool getCurrentMechanicalPosition(MechanicalPoint &)
virtual bool Abort() override
Abort any telescope motion including tracking if possible.
void setSimulation(bool enable)
Toggle driver simulation status A driver can run in simulation mode if Simulation option is enabled b...
virtual void setConnected(bool status, IPState state=IPS_OK, const char *msg=nullptr)
Set connection switch status in the client.
uint32_t getCurrentPollingPeriod() const
getCurrentPollingPeriod Return the current polling period.
TelescopeStatus TrackState
ISwitchVectorProperty SlewRateSP
TelescopePierSide getPierSide()
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...
long getReadScopeStatusInterval() const
bool executeGotoOffset(double ra_offset, double dec_offset)
bool getCurrentMechanicalPosition(MechanicalPoint &p)
int getSlewRateIndex() const
void setLongitude(double lng)
bool executeSync(double ra, double dec)
bool executeReadScopeStatus()
TelescopeStatus getTrackState() const
Implementations for common driver routines.
int IUFindOnSwitchIndex(const ISwitchVectorProperty *svp)
Returns the index of first ON switch it finds in the vector switch property.
static const loggerConf file_off
void configure(const std::string &outputFile, const loggerConf configuration, const int fileVerbosityLevel, const int screenVerbosityLevel)
Method to configure the logger. Called by the DEBUG_CONF() macro. To make implementation easier,...
static Logger & getInstance()
Method to get a reference to the object (i.e., Singleton) It is a static method.
TEST(EQ500XDriverTest, test_LSTSync)
int main(int argc, char **argv)