Instrument Neutral Distributed Interface INDI  2.0.2
test_celestrondriver.cpp
Go to the documentation of this file.
1 #include <gtest/gtest.h>
2 #include <gmock/gmock.h>
3 #include <stdarg.h>
4 #include <math.h>
5 #include <stdint.h>
6 #include <libnova/julian_day.h>
7 #include "indilogger.h"
8 #include "celestrondriver.h"
9 
10 
11 using namespace Celestron;
12 using ::testing::_;
13 using ::testing::StrEq;
14 
15 
16 // Define a new matcher that compares two byte arrays
17 MATCHER_P2(MemEq, buf, n, "")
18 {
19  uint8_t *b1 = (uint8_t *)buf;
20  uint8_t *b2 = (uint8_t *)arg;
21 
22  for (int i = 0; i < n; i++)
23  {
24  if (b1[i] != b2[i])
25  {
26  *result_listener << "byte number " << i + 1 << " do not mach: " \
27  << (int)b1[i] << " != " << (int)b2[i];
28  return false;
29  }
30  }
31  return true;
32 }
33 
34 
36 {
37  public:
39  {
40  fd = 1;
41  simulation = false;
42  }
43 
44  void set_response(const char *fmt, ...)
45  {
46  // simulate the response for the next command
47  va_list args;
48  va_start(args, fmt);
49  vsprintf(response, fmt, args);
50  va_end(args);
51  }
52 
53  MOCK_METHOD3(serial_write, int (const char *cmd, int nbytes, int *nbytes_written));
54  MOCK_METHOD2(serial_read, int (int nbytes, int *nbytes_read));
55 
56  int serial_read_section(char stop_char, int *nbytes_read)
57  {
58  INDI_UNUSED(stop_char);
59  INDI_UNUSED(nbytes_read);
60  return 0;
61  }
62 };
63 
64 
65 TEST(CelestronDriverTest, set_simulation)
66 {
67  MockCelestronDriver driver;
68  driver.set_simulation(true);
69 
70  EXPECT_CALL(driver, serial_write(_, _, _)).Times(0);
71  EXPECT_CALL(driver, serial_read(_, _)).Times(0);
72  EXPECT_TRUE(driver.echo());
73 }
74 
75 TEST(CelestronDriverTest, echoCommand)
76 {
77  MockCelestronDriver driver;
78  driver.set_response("x#");
79 
80  EXPECT_CALL(driver, serial_write(_, 2, _));
81  EXPECT_TRUE(driver.echo());
82 }
83 
84 TEST(CelestronDriverTest, syncCommand)
85 {
86  MockCelestronDriver driver;
87  driver.set_response("#");
88 
89  EXPECT_CALL(driver, serial_write(StrEq("S2000,2000"), 10, _));
90  EXPECT_TRUE(driver.sync(3.0, 45.0, false));
91 
92  EXPECT_CALL(driver, serial_write(StrEq("s20000000,20000000"), 18, _));
93  EXPECT_TRUE(driver.sync(3.0, 45.0, true));
94 }
95 
96 TEST(CelestronDriverTest, gotoCommands)
97 {
98  MockCelestronDriver driver;
99  driver.set_response("#");
100 
101  EXPECT_CALL(driver, serial_write(StrEq("R2000,2000"), 10, _));
102  EXPECT_TRUE(driver.slew_radec(3.0, 45.0, false));
103 
104  EXPECT_CALL(driver, serial_write(StrEq("r20000000,20000000"), 18, _));
105  EXPECT_TRUE(driver.slew_radec(3.0, 45.0, true));
106 
107  EXPECT_CALL(driver, serial_write(StrEq("B2000,2000"), 10, _));
108  EXPECT_TRUE(driver.slew_azalt(45.0, 45.0, false));
109 
110  EXPECT_CALL(driver, serial_write(StrEq("b20000000,20000000"), 18, _));
111  EXPECT_TRUE(driver.slew_azalt(45.0, 45.0, true));
112 }
113 
114 TEST(CelestronDriverTest, getCoordsCommands)
115 {
116  double ra, dec, az, alt;
117  MockCelestronDriver driver;
118 
119  driver.set_response("2000,2000#");
120  EXPECT_CALL(driver, serial_write(StrEq("E"), 1, _));
121  EXPECT_TRUE(driver.get_radec(&ra, &dec, false));
122  ASSERT_FLOAT_EQ(3.0, ra);
123  ASSERT_FLOAT_EQ(45.0, dec);
124 
125  driver.set_response("20000000,20000000#");
126  EXPECT_CALL(driver, serial_write(StrEq("e"), 1, _));
127  EXPECT_TRUE(driver.get_radec(&ra, &dec, true));
128  ASSERT_FLOAT_EQ(3.0, ra);
129  ASSERT_FLOAT_EQ(45.0, dec);
130 
131  driver.set_response("2000,2000#");
132  EXPECT_CALL(driver, serial_write(StrEq("Z"), 1, _));
133  EXPECT_TRUE(driver.get_azalt(&az, &alt, false));
134  ASSERT_FLOAT_EQ(45.0, az);
135  ASSERT_FLOAT_EQ(45.0, alt);
136 
137  driver.set_response("20000000,20000000#");
138  EXPECT_CALL(driver, serial_write(StrEq("z"), 1, _));
139  EXPECT_TRUE(driver.get_azalt(&az, &alt, true));
140  ASSERT_FLOAT_EQ(45.0, az);
141  ASSERT_FLOAT_EQ(45.0, alt);
142 }
143 
144 TEST(CelestronDriverTest, slewingCommands)
145 {
146  MockCelestronDriver driver;
147  driver.set_response("#");
148 }
149 
150 TEST(CelestronDriverTest, getVersionCommands)
151 {
152  char version[8];
153  MockCelestronDriver driver;
154 
155  driver.set_response("\x04\x29#");
156  EXPECT_CALL(driver, serial_write(StrEq("V"), 1, _));
157  EXPECT_CALL(driver, serial_read(3, _));
158  EXPECT_TRUE(driver.get_version(version, 8));
159  ASSERT_STREQ(version, "4.41");
160 
161  driver.set_response("\x05\x07#");
162  uint8_t cmd1[] = {'P', 1, 0x10, 0xfe, 0, 0, 0, 2};
163  EXPECT_CALL(driver, serial_write(MemEq(cmd1, 8), 8, _));
164  EXPECT_CALL(driver, serial_read(3, _));
165  EXPECT_TRUE(driver.get_dev_firmware(CELESTRON_DEV_RA, version, 8));
166  ASSERT_STREQ(version, "5.07");
167 
168  driver.set_response("\x03\x26#");
169  uint8_t cmd2[] = {'P', 1, 0x11, 0xfe, 0, 0, 0, 2};
170  EXPECT_CALL(driver, serial_write(MemEq(cmd2, 8), 8, _));
171  EXPECT_CALL(driver, serial_read(3, _));
172  EXPECT_TRUE(driver.get_dev_firmware(CELESTRON_DEV_DEC, version, 8));
173  ASSERT_STREQ(version, "3.38");
174 }
175 
176 TEST(CelestronDriverTest, setDateTime)
177 {
178  MockCelestronDriver driver;
179 
180  struct ln_date utc;
181  utc.years = 2017;
182  utc.months = 12;
183  utc.days = 18;
184  utc.hours = 10;
185  utc.minutes = 35;
186  utc.seconds = 43.1;
187 
188  driver.set_response("#");
189  uint8_t cmd1[] = {'H', 8, 35, 43, 12, 18, 17, 254, 0};
190  EXPECT_CALL(driver, serial_write(MemEq(cmd1, 9), 9, _));
191  EXPECT_TRUE(driver.set_datetime(&utc, -2.0));
192 }
193 
194 TEST(CelestronDriverTest, setLocation)
195 {
196  MockCelestronDriver driver;
197 
198  driver.set_response("#");
199  uint8_t cmd1[] = {'W', 40, 25, 0, 0, 3, 42, 1, 1};
200  EXPECT_CALL(driver, serial_write(MemEq(cmd1, 9), 9, _));
201  EXPECT_TRUE(driver.set_location(-3.7003, 40.4167));
202 }
203 
204 TEST(CelestronDriverTest, hibernate)
205 {
206  MockCelestronDriver driver;
207 
208  EXPECT_CALL(driver, serial_write(StrEq("x"), 1, _));
209  EXPECT_CALL(driver, serial_read(_, _)).Times(0);
210  EXPECT_TRUE(driver.hibernate());
211 }
212 
213 /*
214 TEST(CelestronDriverTest, getLocation) {
215  MockCelestronDriver driver;
216 
217  driver.set_response("%c%c%c%c%c%c%c%c#", 40, 25, 0, 0, 3, 42, 1, 1);
218  EXPECT_CALL(driver, serial_write(StrEq("w"), 1, _));
219  double lon, lat;
220  EXPECT_TRUE(driver.get_location(&lon, &lat));
221  ASSERT_FLOAT_EQ(-3.7003, lon);
222  ASSERT_FLOAT_EQ(40.4167, lat);
223 }
224 */
225 
226 TEST(CelestronDriverTest, trimDecAngle)
227 {
228  ASSERT_FLOAT_EQ(0, trimDecAngle(0));
229  ASSERT_FLOAT_EQ(0, trimDecAngle(180));
230  ASSERT_FLOAT_EQ(0, trimDecAngle(360));
231 
232  ASSERT_FLOAT_EQ(45, trimDecAngle(45));
233  ASSERT_FLOAT_EQ(90, trimDecAngle(90));
234  ASSERT_FLOAT_EQ(85, trimDecAngle(95));
235  ASSERT_FLOAT_EQ(5, trimDecAngle(175));
236 
237  ASSERT_FLOAT_EQ(-5, trimDecAngle(355));
238  ASSERT_FLOAT_EQ(-20, trimDecAngle(200));
239  ASSERT_FLOAT_EQ(-90, trimDecAngle(270));
240 
241  ASSERT_FLOAT_EQ(-5, trimDecAngle(-5));
242  ASSERT_FLOAT_EQ(-20, trimDecAngle(-20));
243  ASSERT_FLOAT_EQ(90, trimDecAngle(-270));
244 
245  ASSERT_FLOAT_EQ(-5, trimDecAngle(355 + 360));
246 }
247 
248 TEST(CelestronDriverTest, dd2nex)
249 {
250  ASSERT_EQ(0x0000U, dd2nex(0.0));
251  ASSERT_EQ(0x2000U, dd2nex(45.0));
252  ASSERT_EQ(0xc000U, dd2nex(270.0));
253  ASSERT_EQ(0x0000U, dd2nex(360.0));
254  ASSERT_EQ(0x12ceU, dd2nex(26.4441));
255 
256  ASSERT_EQ(0x12ceU, dd2nex(360 + 26.4441));
257  ASSERT_EQ(0xc000U, dd2nex(-90.0));
258 }
259 
260 TEST(CelestronDriverTest, dd2pnex)
261 {
262  ASSERT_EQ(0x00000000U, dd2pnex(0.0));
263  ASSERT_EQ(0x20000000U, dd2pnex(45.0));
264  ASSERT_EQ(0xc0000000U, dd2pnex(270.0));
265  ASSERT_EQ(0x00000000U, dd2pnex(360.0));
266  ASSERT_EQ(0x12ab0500U, dd2pnex(26.25193834305));
267 
268  ASSERT_EQ(0x12ab0500U, dd2pnex(360 + 26.25193834305));
269  ASSERT_EQ(0xc0000000U, dd2pnex(-90.0));
270 }
271 
272 TEST(CelestronDriverTest, nex2dd)
273 {
274  ASSERT_FLOAT_EQ(0.0, nex2dd(0x0000));
275  ASSERT_FLOAT_EQ(45.0, nex2dd(0x2000));
276  ASSERT_FLOAT_EQ(270.0, nex2dd(0xc000));
277  ASSERT_FLOAT_EQ(337.5, nex2dd(0xf000));
278  ASSERT_FLOAT_EQ(26.4441, nex2dd(0x12ce));
279 }
280 
281 TEST(CelestronDriverTest, pnex2dd)
282 {
283  ASSERT_FLOAT_EQ(0.0, pnex2dd(0x00000000));
284  ASSERT_FLOAT_EQ(45.0, pnex2dd(0x20000000));
285  ASSERT_FLOAT_EQ(270.0, pnex2dd(0xc0000000));
286  ASSERT_FLOAT_EQ(337.5, pnex2dd(0xf0000000));
287  ASSERT_FLOAT_EQ(26.25193834305, pnex2dd(0x12ab0500));
288 }
289 
290 
291 int main(int argc, char **argv)
292 {
295 
296  ::testing::InitGoogleTest(&argc, argv);
297  ::testing::InitGoogleMock(&argc, argv);
298  return RUN_ALL_TESTS();
299 }
#define CELESTRON_DEV_RA
#define CELESTRON_DEV_DEC
bool slew_radec(double ra, double dec, bool precise)
bool get_azalt(double *az, double *alt, bool precise)
bool set_datetime(struct ln_date *utc, double utc_offset, bool dst=false, bool precise=false)
bool set_location(double longitude, double latitude)
bool sync(double ra, double dec, bool precise)
bool get_dev_firmware(int dev, char *version, size_t size)
bool get_radec(double *ra, double *dec, bool precise)
void set_simulation(bool enable)
bool get_version(char *version, size_t size)
bool slew_azalt(double az, double alt, bool precise)
MOCK_METHOD3(serial_write, int(const char *cmd, int nbytes, int *nbytes_written))
MOCK_METHOD2(serial_read, int(int nbytes, int *nbytes_read))
void set_response(const char *fmt,...)
int serial_read_section(char stop_char, int *nbytes_read)
double ra
double dec
#define INDI_UNUSED(x)
Definition: indidevapi.h:131
int fd
Definition: intelliscope.c:43
double pnex2dd(uint32_t value)
uint32_t dd2pnex(double angle)
uint16_t dd2nex(double angle)
double trimDecAngle(double angle)
double nex2dd(uint32_t value)
__u8 cmd[4]
Definition: pwc-ioctl.h:2
static const loggerConf file_off
Definition: indilogger.h:219
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,...
Definition: indilogger.cpp:283
static Logger & getInstance()
Method to get a reference to the object (i.e., Singleton) It is a static method.
Definition: indilogger.cpp:339
MATCHER_P2(MemEq, buf, n, "")
int main(int argc, char **argv)
TEST(CelestronDriverTest, set_simulation)