37#include "dccl/logger.h"
39#include "../../ccl/WhoiUtil.h"
43bool close(
double a,
double b,
double tol)
45 bool ok = std::abs(a - b) <= tol;
47 std::cerr <<
"expected " << b <<
" (+/- " << tol <<
"), got " << a << std::endl;
54 const double tol = 3e-5;
55 for (
double deg : {0.0, 1.0, -1.0, 42.35, -42.35, 179.9, -179.9, 89.999, -89.999})
56 assert(close(Decode_latlon(Encode_latlon(deg)), deg, tol));
60 assert(Decode_latlon(Encode_latlon(-120.0)) < 0);
61 assert(Decode_latlon(Encode_latlon(120.0)) > 0);
62 assert(close(Decode_latlon(Encode_latlon(0.0)), 0.0, 1e-9));
67 for (
float deg : {0.0f, 45.0f, 90.0f, 180.0f, 270.0f, 359.0f})
68 assert(close(Decode_heading(Encode_heading(deg)), deg, 1.5));
70 assert(Encode_heading(0.0f) == 0);
71 assert(Encode_heading(360.0f) == 255);
74void check_est_velocity()
77 for (
float v : {0.0f, 0.5f, 1.0f, 2.5f, 5.0f})
78 assert(close(Decode_est_velocity(Encode_est_velocity(v)), v, 0.03));
83 for (
float v : {-1.0f, -2.5f, -5.0f})
84 assert(close(Decode_est_velocity(Encode_est_velocity(v)), v, 0.05));
85 assert(Encode_est_velocity(-1.0f) == -24);
87 assert(Encode_est_velocity(0.0f) == 0);
93 assert(Encode_salinity(19.9f) == 0);
94 assert(Encode_salinity(0.0f) == 0);
95 assert(Decode_salinity(0) == 0.0f);
97 for (
float s : {20.1f, 25.0f, 33.5f, 45.0f})
98 assert(close(Decode_salinity(Encode_salinity(s)), s, 0.11));
101 assert(Encode_salinity(1000.0f) == 255);
106 assert(Encode_depth(-1.0f) == 0);
107 assert(Encode_depth(10000.0f) == 8100);
110 assert(close(Decode_depth(Encode_depth(0.0f)), 0.0, 0.05));
111 assert(close(Decode_depth(Encode_depth(50.0f)), 50.0, 0.05));
112 assert(close(Decode_depth(Encode_depth(99.0f)), 99.0, 0.05));
113 assert(close(Decode_depth(Encode_depth(150.0f)), 150.0, 0.1));
114 assert(close(Decode_depth(Encode_depth(500.0f)), 500.0, 0.25));
115 assert(close(Decode_depth(Encode_depth(3000.0f)), 3000.0, 0.5));
118 assert(close(Decode_depth(8100), 6000.0, 1e-3));
121void check_temperature()
124 assert(Encode_temperature(-100.0f) == 0);
125 assert(Encode_temperature(1000.0f) == 255);
127 for (
float t : {-4.0f, 0.0f, 10.0f, 20.0f, 35.0f})
128 assert(close(Decode_temperature(Encode_temperature(t)), t, 0.09));
131void check_sound_speed()
133 for (
float c : {1425.0f, 1450.0f, 1500.0f, 1550.0f})
134 assert(close(Decode_sound_speed(Encode_sound_speed(c)), c, 0.5));
136 assert(Encode_sound_speed(1425.0f) == 0);
139void check_hires_altitude()
141 assert(Encode_hires_altitude(-1.0f) == 0);
142 assert(Encode_hires_altitude(1000.0f) == 65535U);
144 for (
float a : {0.0f, 1.5f, 100.0f, 655.0f})
145 assert(close(Decode_hires_altitude(Encode_hires_altitude(a)), a, 0.01));
148void check_gfi_pitch_oil()
150 float gfi = 0, pitch = 0, oil = 0;
152 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(50.0f, 30.0f, 75.0f), &gfi, &pitch, &oil);
153 assert(close(gfi, 50.0, 3.5));
154 assert(close(pitch, 30.0, 3.0));
155 assert(close(oil, 75.0, 3.5));
158 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(0.0f, -45.0f, 0.0f), &gfi, &pitch, &oil);
159 assert(close(pitch, -45.0, 3.0));
160 assert(close(gfi, 0.0, 3.5));
161 assert(close(oil, 0.0, 3.5));
164 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(1000.0f, 0.0f, 1000.0f), &gfi, &pitch, &oil);
165 assert(close(gfi, 100.0, 3.5));
166 assert(close(oil, 100.0, 3.5));
168 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(-100.0f, 0.0f, -100.0f), &gfi, &pitch, &oil);
169 assert(close(gfi, 0.0, 3.5));
170 assert(close(oil, 0.0, 3.5));
173 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(0.0f, 89.0f, 0.0f), &gfi, &pitch, &oil);
174 assert(close(pitch, 89.0, 3.0));
175 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(0.0f, -89.0f, 0.0f), &gfi, &pitch, &oil);
176 assert(close(pitch, -89.0, 3.0));
182 assert(Encode_gfi_pitch_oil(0.0f, 90.0f, 0.0f) == Encode_gfi_pitch_oil(0.0f, -90.0f, 0.0f));
183 Decode_gfi_pitch_oil(Encode_gfi_pitch_oil(0.0f, 90.0f, 0.0f), &gfi, &pitch, &oil);
184 assert(close(pitch, -91.4286, 1e-3));
187void check_time_date()
192 when.tm_year = 2021 - 1900;
198 long secs =
static_cast<long>(timegm(&when));
200 short mon = 0, day = 0, hour = 0, min = 0, sec = 0;
201 Decode_time_date(Encode_time_date(secs), &mon, &day, &hour, &min, &sec);
210 Decode_time_date(Encode_time_date(0), &mon, &day, &hour, &min, &sec);
220 assert(Encode_watts(0.0f, 0.0f) == 0);
221 assert(Encode_watts(-10.0f, 10.0f) == 0);
222 assert(Encode_watts(1000.0f, 1000.0f) == 255);
224 assert(close(Decode_watts(Encode_watts(10.0f, 10.0f)), 100.0, 4.0));
225 assert(Decode_watts(255) == 1020.0f);
230 for (
float rpm : {0.0f, 50.0f, 127.0f, -127.0f})
231 assert(close(Decode_speed(SPEED_MODE_RPM, Encode_speed(SPEED_MODE_RPM, rpm / 20.0f)), rpm,
234 for (
float msec : {0.0f, 1.0f, 2.5f, 4.2f, -2.0f})
236 close(Decode_speed(SPEED_MODE_MSEC, Encode_speed(SPEED_MODE_MSEC, msec)), msec, 0.04));
239 assert(Encode_speed(SPEED_MODE_RPM, 1000.0f) == 127);
240 assert(Encode_speed(SPEED_MODE_RPM, -1000.0f) == -127);
241 assert(Encode_speed(SPEED_MODE_MSEC, 1000.0f) == 127);
242 assert(Encode_speed(SPEED_MODE_MSEC, -1000.0f) == -127);
245 assert(Decode_speed(SPEED_MODE_KNOTS, 42) == 0);
248void check_ranger_bcd()
250 assert(close(DecodeRangerBCD(0x00), 0.0, 1e-9));
251 assert(close(DecodeRangerBCD(0x42), 42.0, 1e-9));
252 assert(close(DecodeRangerBCD(0x99), 99.0, 1e-9));
254 assert(close(DecodeRangerBCD2(0x12, 0x34), 1234.0, 1e-9));
255 assert(close(DecodeRangerBCD2(0x00, 0x07), 7.0, 1e-9));
258 assert(close(DecodeRangerLL(0x04, 0x1e, 0x23, 0x45, 0x67), 41.0 + 23.4567 / 60.0, 1e-9));
260 assert(close(DecodeRangerLL(0x04, 0x1c, 0x23, 0x45, 0x67), -(41.0 + 23.4567 / 60.0), 1e-9));
261 assert(close(DecodeRangerLL(0x04, 0x1d, 0x23, 0x45, 0x67), -(41.0 + 23.4567 / 60.0), 1e-9));
263 assert(close(DecodeRangerLL(0x12, 0x3e, 0x00, 0x00, 0x00), 123.0, 1e-9));
267int main(
int argc,
char* argv[])
269 bool verbose =
false;
270 for (
int i = 1; i < argc; ++i)
272 if (argv[i] && argv[i][0] ==
'-' && argv[i][1] ==
'v' && argv[i][2] ==
'\0')
276 dccl::dlog.
connect(verbose ? dccl::logger::ALL :
dccl::logger::WARN_PLUS, &std::cerr);
280 check_est_velocity();
285 check_hires_altitude();
286 check_gfi_pitch_oil();
292 std::cout <<
"all tests passed" << std::endl;
void connect(int verbosity_mask, Slot slot)
Connect the output of one or more given verbosities to a slot (function pointer or similar)
Dynamic Compact Control Language namespace.