aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/tests/test_scale.c
blob: ab6eaf0a626860bade45af427ce09db09c261dbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
#include "test.h"
#include "scale.c"

#include "util.c"
#include "fixpt.c"


static void test_scale(void)
{
	fixpt_t ret;

	ret = scale(5, -10, 10,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = scale(5, 10, -10,
		    float_to_fixpt(10.0f), float_to_fixpt(-10.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = scale(5, -10, 10,
		    float_to_fixpt(-1.0f), float_to_fixpt(1.0f));
	CHECK(ret == float_to_fixpt(0.5f));

	ret = scale(5, 10, -10,
		    float_to_fixpt(1.0f), float_to_fixpt(-1.0f));
	CHECK(ret == float_to_fixpt(0.5f));

	ret = scale(-1, 10, -10,
		    float_to_fixpt(1.0f), float_to_fixpt(-1.0f));
	CHECK(ret == float_to_fixpt(-0.1f));

	ret = scale(1, 10, -10,
		    float_to_fixpt(1.0f), float_to_fixpt(-1.0f));
	CHECK(ret == float_to_fixpt(0.1f));

	ret = scale(1000, 0, 2000,
		    float_to_fixpt(0.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = scale(1000, 0, 2000,
		    float_to_fixpt(0.0f), float_to_fixpt(500.0f));
	CHECK(ret == float_to_fixpt(250.0f));

	ret = scale(500, 0, 2000,
		    float_to_fixpt(0.0f), float_to_fixpt(500.0f));
	CHECK(ret == float_to_fixpt(125.0f));

	ret = scale(1000, 0, 2000,
		    float_to_fixpt(500.0f), float_to_fixpt(0.0f));
	CHECK(ret == float_to_fixpt(250.0f));

	ret = scale(500, 0, 2000,
		    float_to_fixpt(500.0f), float_to_fixpt(0.0f));
	CHECK(ret == float_to_fixpt(375.0f));

	ret = scale(128, -10000, 10000,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(0.128f));

	ret = scale(-128, -10000, 10000,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(-0.128f));

	ret = scale(0, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret == float_to_fixpt(0.0f));

	ret = scale(0x3FF, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret == float_to_fixpt(480.0f));

	ret = scale(0x100, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret >= float_to_fixpt(120.1f) &&
	      ret <= float_to_fixpt(120.2f));

	ret = scale(0x200, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret >= float_to_fixpt(240.2f) &&
	      ret <= float_to_fixpt(240.3f));

	ret = scale(0x300, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret >= float_to_fixpt(360.3f) &&
	      ret <= float_to_fixpt(360.4f));

	ret = scale(0, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret == float_to_fixpt(0.0f));

	ret = scale(0x3FF, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = scale(0x100, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret >= float_to_fixpt(1.245f) &&
	      ret <= float_to_fixpt(1.255f));

	ret = scale(0x200, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret >= float_to_fixpt(2.495f) &&
	      ret <= float_to_fixpt(2.505f));

	ret = scale(0x300, 0, 0x3FF,
		    float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret >= float_to_fixpt(3.745f) &&
	      ret <= float_to_fixpt(3.755f));
}

static void test_unscale(void)
{
	int16_t ret;

	ret = unscale(float_to_fixpt(5.0f), float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      -10, 10);
	CHECK(ret == 5);

	ret = unscale(float_to_fixpt(5.0f), float_to_fixpt(10.0f), float_to_fixpt(-10.0f),
		      10, -10);
	CHECK(ret == 5);

	ret = unscale(float_to_fixpt(250.0f), float_to_fixpt(0.0f), float_to_fixpt(500.0f),
		      0, 10);
	CHECK(ret == 5);

	ret = unscale(float_to_fixpt(100.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      0, 500);
	CHECK(ret == 250);

	ret = unscale(float_to_fixpt(50.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      0, 500);
	CHECK(ret == 125);

	ret = unscale(float_to_fixpt(100.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      500, 0);
	CHECK(ret == 250);

	ret = unscale(float_to_fixpt(50.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      500, 0);
	CHECK(ret == 375);

	ret = unscale(float_to_fixpt(12.8f), float_to_fixpt(-100.0f), float_to_fixpt(100.0f),
		      -2000, 2000);
	CHECK(ret == 256);

	ret = unscale(float_to_fixpt(-12.8f), float_to_fixpt(-100.0f), float_to_fixpt(100.0f),
		      -2000, 2000);
	CHECK(ret == -256);

	ret = unscale(float_to_fixpt(0.0f), float_to_fixpt(0.0f), float_to_fixpt(480.0f),
		      0, 0x3FF);
	CHECK(ret == 0);

	ret = unscale(float_to_fixpt(480.0f), float_to_fixpt(0.0f), float_to_fixpt(480.0f),
		      0, 0x3FF);
	CHECK(ret == 0x3FF);

	ret = unscale(float_to_fixpt(120.15f), float_to_fixpt(0.0f), float_to_fixpt(480.0f),
		      0, 0x3FF);
	CHECK(ret == 0x100);

	ret = unscale(float_to_fixpt(240.25f), float_to_fixpt(0.0f), float_to_fixpt(480.0f),
		      0, 0x3FF);
	CHECK(ret == 0x200);

	ret = unscale(float_to_fixpt(360.35f), float_to_fixpt(0.0f), float_to_fixpt(480.0f),
		      0, 0x3FF);
	CHECK(ret == 0x300);

	ret = unscale(float_to_fixpt(0.0f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x3FF);
	CHECK(ret == 0);

	ret = unscale(float_to_fixpt(5.0f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x3FF);
	CHECK(ret == 0x3FF);

	ret = unscale(float_to_fixpt(1.25f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x3FF);
	CHECK(ret == 0x100);

	ret = unscale(float_to_fixpt(2.5f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x3FF);
	CHECK(ret == 0x200);

/* FIXME
	ret = unscale(float_to_fixpt(3.75f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x3FF);
	CHECK(ret == 0x300);
*/

	ret = unscale(float_to_fixpt(5.0f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x1FFF);
	CHECK(ret == 0x1FFF);

	ret = unscale(float_to_fixpt(2.5f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x1FFF);
	CHECK(ret == 0x1000);

	ret = unscale(float_to_fixpt(0.0f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0, 0x1FFF);
	CHECK(ret == 0x0);

	ret = unscale(float_to_fixpt(5.0f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0x1FFF, 0);
	CHECK(ret == 0x0);

	ret = unscale(float_to_fixpt(2.5f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0x1FFF, 0);
	CHECK(ret == 0x1000);

	ret = unscale(float_to_fixpt(0.0f), float_to_fixpt(0.0f), float_to_fixpt(5.0f),
		      0x1FFF, 0);
	CHECK(ret == 0x1FFF);
}

static void test_scale_unscale(void)
{
	fixpt_t fix;
	int16_t raw;

	fix = scale(100, -1000, 1000,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	raw = unscale(fix, float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      -1000, 1000);
	CHECK(raw == 100);

	fix = scale(-100, -1000, 1000,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	raw = unscale(fix, float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      -1000, 1000);
	CHECK(raw == -100);

	raw = unscale(float_to_fixpt(0.1f), float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      -1000, 1000);
	fix = scale(raw, -1000, 1000,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(fix == float_to_fixpt(0.1f));

	raw = unscale(float_to_fixpt(-0.1f), float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      -1000, 1000);
	fix = scale(raw, -1000, 1000,
		    float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(fix == float_to_fixpt(-0.1f));
}

static void test_rescale(void)
{
	fixpt_t ret;

	ret = rescale(float_to_fixpt(5.0f), float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = rescale(float_to_fixpt(5.0f), float_to_fixpt(10.0f), float_to_fixpt(-10.0f),
		      float_to_fixpt(10.0f), float_to_fixpt(-10.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = rescale(float_to_fixpt(5.0f), float_to_fixpt(-10.0f), float_to_fixpt(10.0f),
		      float_to_fixpt(-1.0f), float_to_fixpt(1.0f));
	CHECK(ret == float_to_fixpt(0.5f));

	ret = rescale(float_to_fixpt(5.0f), float_to_fixpt(10.0f), float_to_fixpt(-10.0f),
		      float_to_fixpt(1.0f), float_to_fixpt(-1.0f));
	CHECK(ret == float_to_fixpt(0.5f));

	ret = rescale(float_to_fixpt(-1.0f), float_to_fixpt(10.0f), float_to_fixpt(-10.0f),
		      float_to_fixpt(1.0f), float_to_fixpt(-1.0f));
	CHECK(ret == float_to_fixpt(-0.1f));

	ret = rescale(float_to_fixpt(1.0f), float_to_fixpt(10.0f), float_to_fixpt(-10.0f),
		      float_to_fixpt(1.0f), float_to_fixpt(-1.0f));
	CHECK(ret == float_to_fixpt(0.1f));

	ret = rescale(float_to_fixpt(100.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      float_to_fixpt(0.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = rescale(float_to_fixpt(100.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      float_to_fixpt(0.0f), float_to_fixpt(500.0f));
	CHECK(ret == float_to_fixpt(250.0f));

	ret = rescale(float_to_fixpt(50.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      float_to_fixpt(0.0f), float_to_fixpt(500.0f));
	CHECK(ret == float_to_fixpt(125.0f));

	ret = rescale(float_to_fixpt(100.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      float_to_fixpt(500.0f), float_to_fixpt(0.0f));
	CHECK(ret == float_to_fixpt(250.0f));

	ret = rescale(float_to_fixpt(50.0f), float_to_fixpt(0.0f), float_to_fixpt(200.0f),
		      float_to_fixpt(500.0f), float_to_fixpt(0.0f));
	CHECK(ret == float_to_fixpt(375.0f));

	ret = rescale(float_to_fixpt(12.8f), float_to_fixpt(-100.0f), float_to_fixpt(100.0f),
		      float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(1.28f));

	ret = rescale(float_to_fixpt(-12.8f), float_to_fixpt(-100.0f), float_to_fixpt(100.0f),
		      float_to_fixpt(-10.0f), float_to_fixpt(10.0f));
	CHECK(ret == float_to_fixpt(-1.28f));

	ret = rescale(int_to_fixpt(0), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret == float_to_fixpt(0.0f));

	ret = rescale(int_to_fixpt(0x3FF), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret == float_to_fixpt(480.0f));

	ret = rescale(int_to_fixpt(0x100), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret >= float_to_fixpt(120.1f) &&
	      ret <= float_to_fixpt(120.2f));

	ret = rescale(int_to_fixpt(0x200), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret >= float_to_fixpt(240.2f) &&
	      ret <= float_to_fixpt(240.3f));

	ret = rescale(int_to_fixpt(0x300), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(480.0f));
	CHECK(ret >= float_to_fixpt(360.3f) &&
	      ret <= float_to_fixpt(360.4f));

	ret = rescale(int_to_fixpt(0), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret == float_to_fixpt(0.0f));

	ret = rescale(int_to_fixpt(0x3FF), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret == float_to_fixpt(5.0f));

	ret = rescale(int_to_fixpt(0x100), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret >= float_to_fixpt(1.245f) &&
	      ret <= float_to_fixpt(1.255f));

	ret = rescale(int_to_fixpt(0x200), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret >= float_to_fixpt(2.495f) &&
	      ret <= float_to_fixpt(2.505f));

	ret = rescale(int_to_fixpt(0x300), int_to_fixpt(0), int_to_fixpt(0x3FF),
		      float_to_fixpt(0.0f), float_to_fixpt(5.0f));
	CHECK(ret >= float_to_fixpt(3.745f) &&
	      ret <= float_to_fixpt(3.755f));
}

int main(void)
{
	test_scale();
	test_unscale();
	test_scale_unscale();
	test_rescale();

	return 0;
}
bues.ch cgit interface