| 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 |