Instrument Neutral Distributed Interface INDI 2.2.5
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
11using namespace Celestron;
12using ::testing::_;
13using ::testing::StrEq;
14
15
16// Define a new matcher that compares two byte arrays
17MATCHER_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
65TEST(CelestronDriverTest, set_simulation)
66{
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
75TEST(CelestronDriverTest, echoCommand)
76{
78 driver.set_response("x#");
79
80 EXPECT_CALL(driver, serial_write(_, 2, _));
81 EXPECT_TRUE(driver.echo());
82}
83
84TEST(CelestronDriverTest, syncCommand)
85{
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
96TEST(CelestronDriverTest, gotoCommands)
97{
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
114TEST(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
144TEST(CelestronDriverTest, slewingCommands)
145{
146 MockCelestronDriver driver;
147 driver.set_response("#");
148}
149
150TEST(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
176TEST(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
194TEST(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
204TEST(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/*
214TEST(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
226TEST(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
248TEST(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
260TEST(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
272TEST(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
281TEST(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
291int main(int argc, char **argv)
292{
295
296 ::testing::InitGoogleTest(&argc, argv);
297 ::testing::InitGoogleMock(&argc, argv);
298 return RUN_ALL_TESTS();
299}
std::string fmt(const char *fmt,...)
Definition Utils.cpp:241
#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)
char response[MAX_RESP_SIZE]
virtual int serial_read(int nbytes, int *nbytes_read)
virtual int serial_write(const char *cmd, int nbytes, int *nbytes_written)
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)
int main()
double ra
double dec
#define INDI_UNUSED(x)
Definition indidevapi.h:132
double pnex2dd(uint32_t value)
uint32_t dd2pnex(double angle)
uint16_t dd2nex(double angle)
double trimDecAngle(double angle)
double nex2dd(uint32_t value)
uint8_t 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,...
static Logger & getInstance()
Method to get a reference to the object (i.e., Singleton) It is a static method.
MATCHER_P2(MemEq, buf, n, "")
TEST(CelestronDriverTest, set_simulation)