GCC Code Coverage Report


Directory: main/
File: adapter/wireless/wii.c
Date: 2025-10-04 14:03:00
Exec Total Coverage
Lines: 169 178 94.9%
Functions: 7 7 100.0%
Branches: 77 82 93.9%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2019-2025, Jacques Gagnon
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6 #include <string.h>
7 #include "zephyr/types.h"
8 #include "tools/util.h"
9 #include "bluetooth/hidp/wii.h"
10 #include "tests/cmds.h"
11 #include "bluetooth/mon.h"
12 #include "wii.h"
13
14 #define WIIU_AXES_MAX 4
15 #define NUNCHUCK_AXES_MAX 2
16 enum {
17 WII_CORE_D_LEFT = 0,
18 WII_CORE_D_RIGHT,
19 WII_CORE_D_DOWN,
20 WII_CORE_D_UP,
21 WII_CORE_PLUS,
22 WII_CORE_2 = 8,
23 WII_CORE_1,
24 WII_CORE_B,
25 WII_CORE_A,
26 WII_CORE_MINUS,
27 WII_CORE_HOME = 15,
28 };
29
30 enum {
31 WII_CLASSIC_R = 1,
32 WII_CLASSIC_PLUS,
33 WII_CLASSIC_HOME,
34 WII_CLASSIC_MINUS,
35 WII_CLASSIC_L,
36 WII_CLASSIC_D_DOWN,
37 WII_CLASSIC_D_RIGHT,
38 WII_CLASSIC_D_UP,
39 WII_CLASSIC_D_LEFT,
40 WII_CLASSIC_ZR,
41 WII_CLASSIC_X,
42 WII_CLASSIC_A,
43 WII_CLASSIC_Y,
44 WII_CLASSIC_B,
45 WII_CLASSIC_ZL,
46 };
47
48 enum {
49 WII_NUNCHUCK_Z = 0,
50 WII_NUNCHUCK_C,
51 };
52
53 enum {
54 WIIU_R = 1,
55 WIIU_PLUS,
56 WIIU_HOME,
57 WIIU_MINUS,
58 WIIU_L,
59 WIIU_D_DOWN,
60 WIIU_D_RIGHT,
61 WIIU_D_UP,
62 WIIU_D_LEFT,
63 WIIU_ZR,
64 WIIU_X,
65 WIIU_A,
66 WIIU_Y,
67 WIIU_B,
68 WIIU_ZL,
69 WIIU_RJ,
70 WIIU_LJ,
71 };
72
73 struct wiic_map {
74 uint16_t core;
75 uint8_t reserved[3];
76 uint8_t axes[4];
77 uint16_t buttons;
78 } __packed;
79
80 struct wiic_8bit_map {
81 uint16_t core;
82 uint8_t reserved[3];
83 uint8_t axes[6];
84 uint16_t buttons;
85 } __packed;
86
87 struct wiin_map {
88 uint16_t core;
89 uint8_t reserved[3];
90 uint8_t axes[5];
91 uint8_t buttons;
92 } __packed;
93
94 struct wiiu_map {
95 uint8_t reserved[5];
96 uint16_t axes[4];
97 uint32_t buttons;
98 } __packed;
99
100 static const uint8_t led_dev_id_map[] = {
101 0x1, 0x2, 0x4, 0x8, 0x3, 0x6, 0xC
102 };
103
104 static const uint8_t wiic_8bit_axes_idx[ADAPTER_MAX_AXES] =
105 {
106 /* AXIS_LX, AXIS_LY, AXIS_RX, AXIS_RY, TRIG_L, TRIG_R */
107 0, 2, 1, 3, 4, 5
108 };
109
110 static const uint8_t wiiu_axes_idx[WIIU_AXES_MAX] =
111 {
112 /* AXIS_LX, AXIS_LY, AXIS_RX, AXIS_RY */
113 0, 2, 1, 3
114 };
115
116 static const struct ctrl_meta wiin_axes_meta[NUNCHUCK_AXES_MAX] =
117 {
118 {.neutral = 0x80, .abs_max = 0x63, .abs_min = 0x63},
119 {.neutral = 0x80, .abs_max = 0x63, .abs_min = 0x63},
120 };
121
122 static const struct ctrl_meta wiic_axes_meta[ADAPTER_MAX_AXES] =
123 {
124 {.neutral = 0x20, .abs_max = 0x1B, .abs_min = 0x1B},
125 {.neutral = 0x20, .abs_max = 0x1B, .abs_min = 0x1B},
126 {.neutral = 0x10, .abs_max = 0x0D, .abs_min = 0x0D},
127 {.neutral = 0x10, .abs_max = 0x0D, .abs_min = 0x0D},
128 {.neutral = 0x02, .abs_max = 0x1D, .abs_min = 0x00},
129 {.neutral = 0x02, .abs_max = 0x1D, .abs_min = 0x00},
130 };
131
132 static const struct ctrl_meta wiic_8bit_axes_meta[ADAPTER_MAX_AXES] =
133 {
134 {.neutral = 0x80, .abs_max = 0x66, .abs_min = 0x66},
135 {.neutral = 0x80, .abs_max = 0x66, .abs_min = 0x66},
136 {.neutral = 0x80, .abs_max = 0x66, .abs_min = 0x66},
137 {.neutral = 0x80, .abs_max = 0x66, .abs_min = 0x66},
138 {.neutral = 0x16, .abs_max = 0xDA, .abs_min = 0x00},
139 {.neutral = 0x16, .abs_max = 0xDA, .abs_min = 0x00},
140 };
141
142 static const struct ctrl_meta wiiu_axes_meta[WIIU_AXES_MAX] =
143 {
144 {.neutral = 0x800, .abs_max = 0x44C, .abs_min = 0x44C},
145 {.neutral = 0x800, .abs_max = 0x44C, .abs_min = 0x44C},
146 {.neutral = 0x800, .abs_max = 0x44C, .abs_min = 0x44C},
147 {.neutral = 0x800, .abs_max = 0x44C, .abs_min = 0x44C},
148 };
149
150 static const uint32_t wii_mask[4] = {0x007F0F00, 0x00000000, 0x00000000, 0x00000000};
151 static const uint32_t wii_desc[4] = {0x00000000, 0x00000000, 0x00000000, 0x00000000};
152 static const uint32_t wiin_mask[4] = {0x13770F0F, 0x00000000, 0x00000000, 0x00000000};
153 static const uint32_t wiin_desc[4] = {0x0000000F, 0x00000000, 0x00000000, 0x00000000};
154 static const uint32_t wiic_mask[4] = {0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000};
155 static const uint32_t wiic_desc[4] = {0x110000FF, 0x00000000, 0x00000000, 0x00000000};
156 static const uint32_t wiic_pro_mask[4] = {0xBBFFFFFF, 0x00000000, 0x00000000, 0x00000000};
157 static const uint32_t wiic_pro_desc[4] = {0x000000FF, 0x00000000, 0x00000000, 0x00000000};
158 static const uint32_t wiiu_mask[4] = {0xBB7F0FFF, 0x00000000, 0x00000000, 0x00000000};
159 static const uint32_t wiiu_desc[4] = {0x000000FF, 0x00000000, 0x00000000, 0x00000000};
160
161 static const uint32_t wii_btns_mask[32] = {
162 0, 0, 0, 0,
163 0, 0, 0, 0,
164 BIT(WII_CORE_D_UP), BIT(WII_CORE_D_DOWN), BIT(WII_CORE_D_LEFT), BIT(WII_CORE_D_RIGHT),
165 0, 0, 0, 0,
166 BIT(WII_CORE_1), BIT(WII_CORE_B), BIT(WII_CORE_2), BIT(WII_CORE_A),
167 BIT(WII_CORE_PLUS), BIT(WII_CORE_MINUS), BIT(WII_CORE_HOME), 0,
168 0, 0, 0, 0,
169 0, 0, 0, 0,
170 };
171 static const uint32_t wiin_btns_mask[32] = {
172 0, 0, 0, 0,
173 0, 0, 0, 0,
174 0, 0, 0, 0,
175 0, 0, 0, 0,
176 0, 0, 0, 0,
177 0, 0, 0, 0,
178 BIT(WII_NUNCHUCK_Z), BIT(WII_NUNCHUCK_C), 0, 0,
179 0, 0, 0, 0,
180 };
181 static const uint32_t wiin_core_btns_mask[32] = {
182 0, 0, 0, 0,
183 0, 0, 0, 0,
184 BIT(WII_CORE_D_LEFT), BIT(WII_CORE_D_RIGHT), BIT(WII_CORE_D_DOWN), BIT(WII_CORE_D_UP),
185 0, 0, 0, 0,
186 BIT(WII_CORE_1), BIT(WII_CORE_2), BIT(WII_CORE_A), 0,
187 BIT(WII_CORE_PLUS), BIT(WII_CORE_MINUS), BIT(WII_CORE_HOME), 0,
188 0, 0, 0, 0,
189 BIT(WII_CORE_B), 0, 0, 0,
190 };
191 static const uint32_t wiic_btns_mask[32] = {
192 0, 0, 0, 0,
193 0, 0, 0, 0,
194 BIT(WII_CLASSIC_D_LEFT), BIT(WII_CLASSIC_D_RIGHT), BIT(WII_CLASSIC_D_DOWN), BIT(WII_CLASSIC_D_UP),
195 0, 0, 0, 0,
196 BIT(WII_CLASSIC_Y), BIT(WII_CLASSIC_A), BIT(WII_CLASSIC_B), BIT(WII_CLASSIC_X),
197 BIT(WII_CLASSIC_PLUS), BIT(WII_CLASSIC_MINUS), BIT(WII_CLASSIC_HOME), 0,
198 0, BIT(WII_CLASSIC_ZL), BIT(WII_CLASSIC_L), 0,
199 0, BIT(WII_CLASSIC_ZR), BIT(WII_CLASSIC_R), 0,
200 };
201 static const uint32_t wiic_pro_btns_mask[32] = {
202 0, 0, 0, 0,
203 0, 0, 0, 0,
204 BIT(WII_CLASSIC_D_LEFT), BIT(WII_CLASSIC_D_RIGHT), BIT(WII_CLASSIC_D_DOWN), BIT(WII_CLASSIC_D_UP),
205 0, 0, 0, 0,
206 BIT(WII_CLASSIC_Y), BIT(WII_CLASSIC_A), BIT(WII_CLASSIC_B), BIT(WII_CLASSIC_X),
207 BIT(WII_CLASSIC_PLUS), BIT(WII_CLASSIC_MINUS), BIT(WII_CLASSIC_HOME), 0,
208 BIT(WII_CLASSIC_ZL), BIT(WII_CLASSIC_L), 0, 0,
209 BIT(WII_CLASSIC_ZR), BIT(WII_CLASSIC_R), 0, 0,
210 };
211 static const uint32_t wiic_core_btns_mask[32] = {
212 0, 0, 0, 0,
213 0, 0, 0, 0,
214 0, 0, 0, 0,
215 BIT(WII_CORE_D_UP), BIT(WII_CORE_D_DOWN), BIT(WII_CORE_D_LEFT), BIT(WII_CORE_D_RIGHT),
216 0, 0, 0, 0,
217 0, 0, 0, BIT(WII_CORE_B),
218 0, 0, 0, BIT(WII_CORE_1),
219 0, 0, 0, BIT(WII_CORE_2),
220 };
221 static const uint32_t wiiu_btns_mask[32] = {
222 0, 0, 0, 0,
223 0, 0, 0, 0,
224 BIT(WIIU_D_LEFT), BIT(WIIU_D_RIGHT), BIT(WIIU_D_DOWN), BIT(WIIU_D_UP),
225 0, 0, 0, 0,
226 BIT(WIIU_Y), BIT(WIIU_A), BIT(WIIU_B), BIT(WIIU_X),
227 BIT(WIIU_PLUS), BIT(WIIU_MINUS), BIT(WIIU_HOME), 0,
228 BIT(WIIU_ZL), BIT(WIIU_L), 0, BIT(WIIU_LJ),
229 BIT(WIIU_ZR), BIT(WIIU_R), 0, BIT(WIIU_RJ),
230 };
231
232 13 static int32_t wiimote_to_generic(struct bt_data *bt_data, struct wireless_ctrl *ctrl_data) {
233 13 uint16_t *buttons = (uint16_t *)bt_data->base.input;
234
235 13 TESTS_CMDS_LOG("\"wireless_input\": {\"report_id\": %ld, \"btns\": %u},\n",
236 bt_data->base.report_id, *buttons);
237
238 13 memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
239
240 13 ctrl_data->mask = (uint32_t *)wii_mask;
241 13 ctrl_data->desc = (uint32_t *)wii_desc;
242
243
2/2
✓ Branch 0 (8→5) taken 416 times.
✓ Branch 1 (8→9) taken 13 times.
429 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
244
2/2
✓ Branch 0 (5→6) taken 22 times.
✓ Branch 1 (5→7) taken 394 times.
416 if (*buttons & wii_btns_mask[i]) {
245 22 ctrl_data->btns[0].value |= generic_btns_mask[i];
246 }
247 }
248
249 13 return 0;
250 }
251
252 22 static int32_t wiin_to_generic(struct bt_data *bt_data, struct wireless_ctrl *ctrl_data) {
253 22 struct wiin_map *map = (struct wiin_map *)bt_data->base.input;
254 22 struct ctrl_meta *meta = bt_data->raw_src_mappings[PAD].meta;
255
256 22 TESTS_CMDS_LOG("\"wireless_input\": {\"report_id\": %ld, \"axes\": [%u, %u], \"btns\": [%u, %u]},\n",
257 bt_data->base.report_id, map->axes[0], map->axes[1], map->core, map->buttons);
258
259 22 memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
260
261 22 ctrl_data->mask = (uint32_t *)wiin_mask;
262 22 ctrl_data->desc = (uint32_t *)wiin_desc;
263
264
2/2
✓ Branch 0 (8→5) taken 704 times.
✓ Branch 1 (8→9) taken 22 times.
726 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
265
2/2
✓ Branch 0 (5→6) taken 22 times.
✓ Branch 1 (5→7) taken 682 times.
704 if (map->core & wiin_core_btns_mask[i]) {
266 22 ctrl_data->btns[0].value |= generic_btns_mask[i];
267 }
268 }
269
270
2/2
✓ Branch 0 (13→10) taken 704 times.
✓ Branch 1 (13→14) taken 22 times.
726 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
271
2/2
✓ Branch 0 (10→11) taken 4 times.
✓ Branch 1 (10→12) taken 700 times.
704 if (~map->buttons & wiin_btns_mask[i]) {
272 4 ctrl_data->btns[0].value |= generic_btns_mask[i];
273 }
274 }
275
276
2/2
✓ Branch 0 (15→16) taken 2 times.
✓ Branch 1 (15→26) taken 20 times.
22 if (!atomic_test_bit(&bt_data->base.flags[PAD], BT_INIT)) {
277 2 memcpy(meta, wiin_axes_meta, sizeof(wiin_axes_meta));
278 2 bt_mon_log(false, "%s: axes_cal: [", __FUNCTION__);
279
2/2
✓ Branch 0 (23→19) taken 4 times.
✓ Branch 1 (23→24) taken 2 times.
6 for (uint32_t i = 0; i < NUNCHUCK_AXES_MAX; i++) {
280 4 meta[i].abs_max *= MAX_PULL_BACK;
281 4 meta[i].abs_min *= MAX_PULL_BACK;
282 4 bt_data->base.axes_cal[i] = -(map->axes[i] - wiin_axes_meta[i].neutral);
283
2/2
✓ Branch 0 (19→20) taken 2 times.
✓ Branch 1 (19→21) taken 2 times.
4 if (i) {
284 2 bt_mon_log(false, ", ");
285 }
286 4 bt_mon_log(false, "%d", bt_data->base.axes_cal[i]);
287 }
288 2 atomic_set_bit(&bt_data->base.flags[PAD], BT_INIT);
289 2 bt_mon_log(true, "]");
290 }
291
292
2/2
✓ Branch 0 (28→27) taken 44 times.
✓ Branch 1 (28→29) taken 22 times.
66 for (uint32_t i = 0; i < NUNCHUCK_AXES_MAX; i++) {
293 44 ctrl_data->axes[i].meta = &meta[i];
294 44 ctrl_data->axes[i].value = map->axes[i] - wiin_axes_meta[i].neutral + bt_data->base.axes_cal[i];
295 }
296
297 22 return 0;
298 }
299
300 62 static int32_t wiic_to_generic(struct bt_data *bt_data, struct wireless_ctrl *ctrl_data) {
301 62 struct wiic_map *map = (struct wiic_map *)bt_data->base.input;
302 62 struct ctrl_meta *meta = bt_data->raw_src_mappings[PAD].meta;
303 62 uint8_t axes[6];
304 62 const uint32_t *btns_mask = wiic_btns_mask;
305
306 62 axes[0] = map->axes[0] & 0x3F;
307 62 axes[1] = map->axes[1] & 0x3F;
308 62 axes[2] = ((map->axes[0] & 0xC0) >> 3) | ((map->axes[1] & 0xC0) >> 5) | ((map->axes[2] & 0x80) >> 7);
309 62 axes[3] = map->axes[2] & 0x1F;
310 62 axes[4] = ((map->axes[2] & 0x60) >> 2) | ((map->axes[3] & 0xE0) >> 5);
311 62 axes[5] = map->axes[3] & 0x1F;
312
313 62 TESTS_CMDS_LOG("\"wireless_input\": {\"report_id\": %ld, \"axes\": [%u, %u, %u, %u, %u, %u], \"btns\": [%u, %u]},\n",
314 bt_data->base.report_id, axes[0], axes[1], axes[2], axes[3], axes[4], axes[5], map->core, map->buttons);
315
316 62 memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
317
318
2/2
✓ Branch 0 (4→5) taken 31 times.
✓ Branch 1 (4→6) taken 31 times.
62 switch (bt_data->base.pids->subtype) {
319 31 case BT_WII_CLASSIC_PRO:
320 31 ctrl_data->mask = (uint32_t *)wiic_pro_mask;
321 31 ctrl_data->desc = (uint32_t *)wiic_pro_desc;
322 31 btns_mask = wiic_pro_btns_mask;
323 31 break;
324 31 default:
325 31 ctrl_data->mask = (uint32_t *)wiic_mask;
326 31 ctrl_data->desc = (uint32_t *)wiic_desc;
327 31 break;
328 }
329
330
2/2
✓ Branch 0 (8→9) taken 4 times.
✓ Branch 1 (8→22) taken 58 times.
62 if (!atomic_test_bit(&bt_data->base.flags[PAD], BT_INIT)) {
331 4 struct wiic_8bit_map *map_8bit = (struct wiic_8bit_map *)bt_data->base.input;
332
1/2
✗ Branch 0 (9→10) not taken.
✓ Branch 1 (9→12) taken 4 times.
4 if (map_8bit->buttons != 0x0000) {
333 bt_type_update(bt_data->base.pids->id, BT_WII, bt_data->base.pids->subtype + 1);
334 return -1;
335 }
336 4 memcpy(meta, wiic_axes_meta, sizeof(wiic_axes_meta));
337 4 bt_mon_log(false, "%s: axes_cal: [", __FUNCTION__);
338
2/2
✓ Branch 0 (19→15) taken 24 times.
✓ Branch 1 (19→20) taken 4 times.
28 for (uint32_t i = 0; i < ADAPTER_MAX_AXES; i++) {
339 24 meta[i].abs_max *= MAX_PULL_BACK;
340 24 meta[i].abs_min *= MAX_PULL_BACK;
341 24 bt_data->base.axes_cal[i] = -(axes[i] - wiic_axes_meta[i].neutral);
342
2/2
✓ Branch 0 (15→16) taken 20 times.
✓ Branch 1 (15→17) taken 4 times.
24 if (i) {
343 20 bt_mon_log(false, ", ");
344 }
345 24 bt_mon_log(false, "%d", bt_data->base.axes_cal[i]);
346 }
347 4 atomic_set_bit(&bt_data->base.flags[PAD], BT_INIT);
348 4 bt_mon_log(true, "]");
349 }
350
351
2/2
✓ Branch 0 (26→23) taken 1984 times.
✓ Branch 1 (26→30) taken 62 times.
2046 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
352
2/2
✓ Branch 0 (23→24) taken 28 times.
✓ Branch 1 (23→25) taken 1956 times.
1984 if (map->core & wiic_core_btns_mask[i]) {
353 28 ctrl_data->btns[0].value |= generic_btns_mask[i];
354 }
355 }
356
357
2/2
✓ Branch 0 (30→27) taken 1984 times.
✓ Branch 1 (30→32) taken 62 times.
2046 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
358
2/2
✓ Branch 0 (27→28) taken 60 times.
✓ Branch 1 (27→29) taken 1924 times.
1984 if (~map->buttons & btns_mask[i]) {
359 60 ctrl_data->btns[0].value |= generic_btns_mask[i];
360 }
361 }
362
363
2/2
✓ Branch 0 (32→31) taken 372 times.
✓ Branch 1 (32→33) taken 62 times.
434 for (uint32_t i = 0; i < ADAPTER_MAX_AXES; i++) {
364 372 ctrl_data->axes[i].meta = &meta[i];
365 372 ctrl_data->axes[i].value = axes[i] - wiic_axes_meta[i].neutral + bt_data->base.axes_cal[i];
366 }
367
368 return 0;
369 }
370
371 66 static int32_t wiic_8bit_to_generic(struct bt_data *bt_data, struct wireless_ctrl *ctrl_data) {
372 66 struct wiic_8bit_map *map = (struct wiic_8bit_map *)bt_data->base.input;
373 66 struct ctrl_meta *meta = bt_data->raw_src_mappings[PAD].meta;
374 66 const uint32_t *btns_mask = wiic_btns_mask;
375
376 66 TESTS_CMDS_LOG("\"wireless_input\": {\"report_id\": %ld, \"axes\": [%u, %u, %u, %u, %u, %u], \"btns\": [%u, %u]},\n",
377 bt_data->base.report_id, map->axes[wiic_8bit_axes_idx[0]], map->axes[wiic_8bit_axes_idx[1]],
378 map->axes[wiic_8bit_axes_idx[2]], map->axes[wiic_8bit_axes_idx[3]], map->axes[wiic_8bit_axes_idx[4]],
379 map->axes[wiic_8bit_axes_idx[5]], map->core, map->buttons);
380
381 66 memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
382
383
2/2
✓ Branch 0 (4→5) taken 33 times.
✓ Branch 1 (4→6) taken 33 times.
66 switch (bt_data->base.pids->subtype) {
384 33 case BT_WII_CLASSIC_PRO_8BIT:
385 33 ctrl_data->mask = (uint32_t *)wiic_pro_mask;
386 33 ctrl_data->desc = (uint32_t *)wiic_pro_desc;
387 33 btns_mask = wiic_pro_btns_mask;
388 33 break;
389 33 default:
390 33 ctrl_data->mask = (uint32_t *)wiic_mask;
391 33 ctrl_data->desc = (uint32_t *)wiic_desc;
392 33 break;
393 }
394
395
2/2
✓ Branch 0 (8→9) taken 4 times.
✓ Branch 1 (8→22) taken 62 times.
66 if (!atomic_test_bit(&bt_data->base.flags[PAD], BT_INIT)) {
396
1/2
✗ Branch 0 (9→10) not taken.
✓ Branch 1 (9→12) taken 4 times.
4 if (map->buttons == 0x0000) {
397 bt_type_update(bt_data->base.pids->id, BT_WII, bt_data->base.pids->subtype - 1);
398 return -1;
399 }
400 4 memcpy(meta, wiic_8bit_axes_meta, sizeof(wiic_8bit_axes_meta));
401 4 bt_mon_log(false, "%s: axes_cal: [", __FUNCTION__);
402
2/2
✓ Branch 0 (19→15) taken 24 times.
✓ Branch 1 (19→20) taken 4 times.
28 for (uint32_t i = 0; i < ADAPTER_MAX_AXES; i++) {
403 24 meta[i].abs_max *= MAX_PULL_BACK;
404 24 meta[i].abs_min *= MAX_PULL_BACK;
405 24 bt_data->base.axes_cal[i] = -(map->axes[wiic_8bit_axes_idx[i]] - wiic_8bit_axes_meta[i].neutral);
406
2/2
✓ Branch 0 (15→16) taken 20 times.
✓ Branch 1 (15→17) taken 4 times.
24 if (i) {
407 20 bt_mon_log(false, ", ");
408 }
409 24 bt_mon_log(false, "%d", bt_data->base.axes_cal[i]);
410 }
411 4 atomic_set_bit(&bt_data->base.flags[PAD], BT_INIT);
412 4 bt_mon_log(true, "]");
413 }
414
415
2/2
✓ Branch 0 (26→23) taken 2112 times.
✓ Branch 1 (26→30) taken 66 times.
2178 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
416
2/2
✓ Branch 0 (23→24) taken 28 times.
✓ Branch 1 (23→25) taken 2084 times.
2112 if (map->core & wiic_core_btns_mask[i]) {
417 28 ctrl_data->btns[0].value |= generic_btns_mask[i];
418 }
419 }
420
421
2/2
✓ Branch 0 (30→27) taken 2112 times.
✓ Branch 1 (30→32) taken 66 times.
2178 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
422
2/2
✓ Branch 0 (27→28) taken 60 times.
✓ Branch 1 (27→29) taken 2052 times.
2112 if (~map->buttons & btns_mask[i]) {
423 60 ctrl_data->btns[0].value |= generic_btns_mask[i];
424 }
425 }
426
427
2/2
✓ Branch 0 (32→31) taken 396 times.
✓ Branch 1 (32→33) taken 66 times.
462 for (uint32_t i = 0; i < ADAPTER_MAX_AXES; i++) {
428 396 ctrl_data->axes[i].meta = &meta[i];
429 396 ctrl_data->axes[i].value = map->axes[wiic_8bit_axes_idx[i]] - wiic_8bit_axes_meta[i].neutral + bt_data->base.axes_cal[i];
430 }
431
432 return 0;
433 }
434
435 26 static int32_t wiiu_to_generic(struct bt_data *bt_data, struct wireless_ctrl *ctrl_data) {
436 26 struct wiiu_map *map = (struct wiiu_map *)bt_data->base.input;
437 26 struct ctrl_meta *meta = bt_data->raw_src_mappings[PAD].meta;
438
439 26 TESTS_CMDS_LOG("\"wireless_input\": {\"report_id\": %ld, \"axes\": [%u, %u, %u, %u], \"btns\": %lu},\n",
440 bt_data->base.report_id, map->axes[wiiu_axes_idx[0]], map->axes[wiiu_axes_idx[1]],
441 map->axes[wiiu_axes_idx[2]], map->axes[wiiu_axes_idx[3]], map->buttons);
442
443 26 memset((void *)ctrl_data, 0, sizeof(*ctrl_data));
444
445 26 ctrl_data->mask = (uint32_t *)wiiu_mask;
446 26 ctrl_data->desc = (uint32_t *)wiiu_desc;
447
448
2/2
✓ Branch 0 (8→5) taken 832 times.
✓ Branch 1 (8→9) taken 26 times.
858 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
449
2/2
✓ Branch 0 (5→6) taken 34 times.
✓ Branch 1 (5→7) taken 798 times.
832 if (~map->buttons & wiiu_btns_mask[i]) {
450 34 ctrl_data->btns[0].value |= generic_btns_mask[i];
451 }
452 }
453
454
2/2
✓ Branch 0 (10→11) taken 2 times.
✓ Branch 1 (10→21) taken 24 times.
26 if (!atomic_test_bit(&bt_data->base.flags[PAD], BT_INIT)) {
455 2 memcpy(meta, wiiu_axes_meta, sizeof(wiiu_axes_meta));
456 2 bt_mon_log(false, "%s: axes_cal: [", __FUNCTION__);
457
2/2
✓ Branch 0 (18→14) taken 8 times.
✓ Branch 1 (18→19) taken 2 times.
10 for (uint32_t i = 0; i < WIIU_AXES_MAX; i++) {
458 8 meta[i].abs_max *= MAX_PULL_BACK;
459 8 meta[i].abs_min *= MAX_PULL_BACK;
460 8 bt_data->base.axes_cal[i] = -(map->axes[wiiu_axes_idx[i]] - wiiu_axes_meta[i].neutral);
461
2/2
✓ Branch 0 (14→15) taken 6 times.
✓ Branch 1 (14→16) taken 2 times.
8 if (i) {
462 6 bt_mon_log(false, ", ");
463 }
464 8 bt_mon_log(false, "%d", bt_data->base.axes_cal[i]);
465 }
466 2 atomic_set_bit(&bt_data->base.flags[PAD], BT_INIT);
467 2 bt_mon_log(true, "]");
468 }
469
470
2/2
✓ Branch 0 (23→22) taken 104 times.
✓ Branch 1 (23→24) taken 26 times.
130 for (uint32_t i = 0; i < WIIU_AXES_MAX; i++) {
471 104 ctrl_data->axes[i].meta = &meta[i];
472 104 ctrl_data->axes[i].value = map->axes[wiiu_axes_idx[i]] - wiiu_axes_meta[i].neutral + bt_data->base.axes_cal[i];
473 }
474
475 26 return 0;
476 }
477
478 189 int32_t wii_to_generic(struct bt_data *bt_data, struct wireless_ctrl *ctrl_data) {
479
5/5
✓ Branch 0 (2→3) taken 22 times.
✓ Branch 1 (2→5) taken 62 times.
✓ Branch 2 (2→6) taken 66 times.
✓ Branch 3 (2→7) taken 26 times.
✓ Branch 4 (2→8) taken 13 times.
189 switch (bt_data->base.pids->subtype) {
480 22 case BT_WII_NUNCHUCK:
481 22 return wiin_to_generic(bt_data, ctrl_data);
482 62 case BT_WII_CLASSIC:
483 case BT_WII_CLASSIC_PRO:
484 62 return wiic_to_generic(bt_data, ctrl_data);
485 66 case BT_WII_CLASSIC_8BIT:
486 case BT_WII_CLASSIC_PRO_8BIT:
487 66 return wiic_8bit_to_generic(bt_data, ctrl_data);
488 26 case BT_WIIU_PRO:
489 26 return wiiu_to_generic(bt_data, ctrl_data);
490 13 default:
491 13 return wiimote_to_generic(bt_data, ctrl_data);
492 }
493 }
494
495 7 bool wii_fb_from_generic(struct generic_fb *fb_data, struct bt_data *bt_data) {
496 7 struct bt_hidp_wii_conf *set_conf = (struct bt_hidp_wii_conf *)bt_data->base.output;
497 7 uint8_t cur_val = set_conf->conf;
498
499
1/3
✓ Branch 0 (2→3) taken 7 times.
✗ Branch 1 (2→6) not taken.
✗ Branch 2 (2→7) not taken.
7 switch (fb_data->type) {
500 7 case FB_TYPE_RUMBLE:
501
1/2
✓ Branch 0 (3→4) taken 7 times.
✗ Branch 1 (3→5) not taken.
7 if (fb_data->state) {
502 7 set_conf->conf |= 0x01;
503 }
504 else {
505 set_conf->conf &= ~0x01;
506 }
507 break;
508 case FB_TYPE_PLAYER_LED:
509 set_conf->conf &= 0x0F;
510 set_conf->conf |= (led_dev_id_map[bt_data->base.pids->id] << 4);
511 break;
512 }
513 7 return (cur_val != set_conf->conf);
514 }
515