GCC Code Coverage Report


Directory: main/
File: adapter/wired/jvs.c
Date: 2025-10-04 14:03:00
Exec Total Coverage
Lines: 0 74 0.0%
Functions: 0 4 0.0%
Branches: 0 46 0.0%

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 "zephyr/atomic.h"
9 #include "tools/util.h"
10 #include "adapter/wired/wired.h"
11 #include "tests/cmds.h"
12 #include "bluetooth/mon.h"
13 #include "jvs.h"
14
15 #define JVS_AXES_MAX 2
16
17 enum {
18 JVS_2 = 0,
19 JVS_1,
20 JVS_LD_RIGHT,
21 JVS_LD_LEFT,
22 JVS_LD_DOWN,
23 JVS_LD_UP,
24 JVS_SERVICE,
25 JVS_START,
26 JVS_10,
27 JVS_9,
28 JVS_8,
29 JVS_7,
30 JVS_6,
31 JVS_5,
32 JVS_4,
33 JVS_3,
34 };
35
36 static DRAM_ATTR const uint8_t jvs_axes_idx[JVS_AXES_MAX] =
37 {
38 /* AXIS_LX, AXIS_LY */
39 0, 1,
40 };
41
42 static DRAM_ATTR const struct ctrl_meta jvs_axes_meta[JVS_AXES_MAX] =
43 {
44 {.size_min = -32768, .size_max = 32767, .neutral = 0x8000, .abs_max = 0x7FFF, .abs_min = 0x8000},
45 {.size_min = -32768, .size_max = 32767, .neutral = 0x8000, .abs_max = 0x7FFF, .abs_min = 0x8000},
46 };
47
48 struct jvs_map {
49 uint16_t coins;
50 uint16_t buttons;
51 uint16_t axes[2];
52 uint8_t test;
53 } __packed;
54
55 static const uint32_t jvs_mask[4] = {0xBBFF0F0F, 0x00000000, 0x00000000, BR_COMBO_MASK};
56 static const uint32_t jvs_desc[4] = {0x0000000F, 0x00000000, 0x00000000, 0x00000000};
57 static DRAM_ATTR const uint32_t jvs_btns_mask[32] = {
58 0, 0, 0, 0,
59 0, 0, 0, 0,
60 BIT(JVS_LD_LEFT), BIT(JVS_LD_RIGHT), BIT(JVS_LD_DOWN), BIT(JVS_LD_UP),
61 0, 0, 0, 0,
62 BIT(JVS_3), BIT(JVS_2), BIT(JVS_1), BIT(JVS_4),
63 BIT(JVS_START), 0, BIT(JVS_SERVICE), 0,
64 BIT(JVS_5), BIT(JVS_7), 0, BIT(JVS_9),
65 BIT(JVS_6), BIT(JVS_8), 0, BIT(JVS_10),
66 };
67
68 void IRAM_ATTR jvs_init_buffer(int32_t dev_mode, struct wired_data *wired_data) {
69 struct jvs_map *map = (struct jvs_map *)wired_data->output;
70 struct jvs_map *map_mask = (struct jvs_map *)wired_data->output_mask;
71
72 map->coins = 0x0000;
73 map->buttons = 0x0000;
74 for (uint32_t i = 0; i < JVS_AXES_MAX; i++) {
75 map->axes[jvs_axes_idx[i]] = jvs_axes_meta[i].neutral;
76 }
77
78 map_mask->buttons = 0xFFFF;
79 map_mask->axes[0] = 0x0000;
80 map_mask->axes[1] = 0x0000;
81 }
82
83 void jvs_meta_init(struct wired_ctrl *ctrl_data) {
84 memset((void *)ctrl_data, 0, sizeof(*ctrl_data)*4);
85
86 for (uint32_t i = 0; i < WIRED_MAX_DEV; i++) {
87 for (uint32_t j = 0; j < JVS_AXES_MAX; j++) {
88 ctrl_data[i].mask = jvs_mask;
89 ctrl_data[i].desc = jvs_desc;
90 ctrl_data[i].axes[j].meta = &jvs_axes_meta[j];
91 }
92 }
93 }
94
95 void jvs_from_generic(int32_t dev_mode, struct wired_ctrl *ctrl_data, struct wired_data *wired_data) {
96 struct jvs_map map_tmp;
97 uint32_t map_mask = 0xFFFF;
98
99 memcpy((void *)&map_tmp, wired_data->output, sizeof(map_tmp));
100
101 for (uint32_t i = 0; i < ARRAY_SIZE(generic_btns_mask); i++) {
102 if (ctrl_data->map_mask[0] & generic_btns_mask[i]) {
103 if (ctrl_data->btns[0].value & generic_btns_mask[i]) {
104 map_tmp.buttons |= jvs_btns_mask[i];
105 map_mask &= ~jvs_btns_mask[i];
106 wired_data->cnt_mask[i] = ctrl_data->btns[0].cnt_mask[i];
107 }
108 else if (map_mask & jvs_btns_mask[i]) {
109 map_tmp.buttons &= ~jvs_btns_mask[i];
110 wired_data->cnt_mask[i] = 0;
111 }
112 }
113 }
114
115 if (ctrl_data->map_mask[0] & generic_btns_mask[PAD_MS]) {
116 if (ctrl_data->btns[0].value & generic_btns_mask[PAD_MS]) {
117 if (!atomic_test_bit(&wired_data->flags, WIRED_WAITING_FOR_RELEASE)) {
118 atomic_set_bit(&wired_data->flags, WIRED_WAITING_FOR_RELEASE);
119 }
120 }
121 else {
122 if (atomic_test_bit(&wired_data->flags, WIRED_WAITING_FOR_RELEASE)) {
123 uint16_t val_cpu = sys_be16_to_cpu(map_tmp.coins);
124 atomic_clear_bit(&wired_data->flags, WIRED_WAITING_FOR_RELEASE);
125 if (val_cpu < 16383) {
126 val_cpu++;
127 map_tmp.coins = sys_cpu_to_be16(val_cpu);
128 }
129 }
130 }
131 }
132
133 if (ctrl_data->map_mask[0] & generic_btns_mask[PAD_MQ]) {
134 if (ctrl_data->btns[0].value & generic_btns_mask[PAD_MQ]) {
135 map_tmp.test |= 0x80;
136 }
137 else {
138 map_tmp.test &= ~0x80;
139 }
140 }
141
142 for (uint32_t i = 0; i < JVS_AXES_MAX; i++) {
143 if (ctrl_data->map_mask[0] & (axis_to_btn_mask(i) & jvs_desc[0])) {
144 if (ctrl_data->axes[i].value > ctrl_data->axes[i].meta->size_max) {
145 *(uint16_t *)&map_tmp.axes[jvs_axes_idx[i]] = sys_cpu_to_be16(32767);
146 }
147 else if (ctrl_data->axes[i].value < ctrl_data->axes[i].meta->size_min) {
148 *(uint16_t *)&map_tmp.axes[jvs_axes_idx[i]] = sys_cpu_to_be16(-32768);
149 }
150 else {
151 *(uint16_t *)&map_tmp.axes[jvs_axes_idx[i]] = sys_cpu_to_be16((uint16_t)(ctrl_data->axes[i].value + ctrl_data->axes[i].meta->neutral));
152 }
153 }
154 wired_data->cnt_mask[axis_to_btn_id(i)] = ctrl_data->axes[i].cnt_mask;
155 }
156
157 memcpy(wired_data->output, (void *)&map_tmp, sizeof(map_tmp));
158
159 TESTS_CMDS_LOG("\"wired_output\": {\"axes\": [%d, %d], \"btns\": %d, \"COINS\": %d, \"TEST\": %d},\n",
160 map_tmp.axes[jvs_axes_idx[0]], map_tmp.axes[jvs_axes_idx[1]],
161 map_tmp.buttons, map_tmp.coins, map_tmp.test);
162 BT_MON_LOG("\"wired_output\": {\"axes\": [%04X, %04X], \"btns\": %04X, \"COINS\": %04X, \"TEST\": %02X},\n",
163 map_tmp.axes[jvs_axes_idx[0]], map_tmp.axes[jvs_axes_idx[1]],
164 map_tmp.buttons, map_tmp.coins, map_tmp.test);
165 }
166
167 void IRAM_ATTR jvs_gen_turbo_mask(struct wired_data *wired_data) {
168 struct jvs_map *map_mask = (struct jvs_map *)wired_data->output_mask;
169
170 map_mask->buttons = 0xFFFF;
171 map_mask->axes[0] = 0x0000;
172 map_mask->axes[1] = 0x0000;
173
174 wired_gen_turbo_mask_btns16_pos(wired_data, &map_mask->buttons, jvs_btns_mask);
175
176 for (uint32_t i = 0; i < JVS_AXES_MAX; i++) {
177 uint8_t btn_id = axis_to_btn_id(i);
178 uint8_t mask = wired_data->cnt_mask[btn_id] >> 1;
179 if (mask) {
180 if (wired_data->cnt_mask[btn_id] & 1) {
181 if (!(mask & wired_data->frame_cnt)) {
182 map_mask->axes[jvs_axes_idx[i]] = jvs_axes_meta[i].neutral;
183 }
184 }
185 else {
186 if (!((mask & wired_data->frame_cnt) == mask)) {
187 map_mask->axes[jvs_axes_idx[i]] = jvs_axes_meta[i].neutral;
188 }
189 }
190 }
191 }
192 }
193