testing mouse mode and swtich
This commit is contained in:
parent
4bdff1a50d
commit
587fe7ffcf
3 changed files with 52 additions and 17 deletions
|
|
@ -332,6 +332,10 @@ void *dev_out_thread_func(void *ptr) {
|
||||||
mouse_last_hid_report_sent = now;
|
mouse_last_hid_report_sent = now;
|
||||||
|
|
||||||
virt_mouse_send(&mouse_data, &dev_out_data->dev_stats.mouse, &now);
|
virt_mouse_send(&mouse_data, &dev_out_data->dev_stats.mouse, &now);
|
||||||
|
|
||||||
|
// reset mouse movements now
|
||||||
|
dev_out_data->dev_stats.mouse.x = 0;
|
||||||
|
dev_out_data->dev_stats.mouse.y = 0;
|
||||||
|
|
||||||
// this does reset the for, ensuring every other device has nothing to say
|
// this does reset the for, ensuring every other device has nothing to say
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
24
rog_ally.c
24
rog_ally.c
|
|
@ -85,7 +85,16 @@ static char* find_kernel_sysfs_device_path(struct udev *udev) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_next_mode(int current_mode) {
|
static int get_next_mode(int current_mode) {
|
||||||
return 1 + ((current_mode + 1) % 3);
|
if (current_mode == 1)
|
||||||
|
return 2;
|
||||||
|
if (current_mode == 2)
|
||||||
|
return 3;
|
||||||
|
if (current_mode == 3)
|
||||||
|
return 2;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "Invalid current mode: %d -- gamepad will be set\n", current_mode);
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int asus_kbd_ev_map(
|
static int asus_kbd_ev_map(
|
||||||
|
|
@ -184,23 +193,22 @@ static int asus_kbd_ev_map(
|
||||||
char current_mode_str[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
char current_mode_str[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
int current_mode_read_res = read(gamepad_mode_fd, (void*)current_mode_str, sizeof(current_mode_str));
|
int current_mode_read_res = read(gamepad_mode_fd, (void*)current_mode_str, sizeof(current_mode_str));
|
||||||
if (current_mode_read_res > 0) {
|
if (current_mode_read_res > 0) {
|
||||||
|
close(gamepad_mode_fd);
|
||||||
|
|
||||||
int current_mode;
|
int current_mode;
|
||||||
sscanf("%d", current_mode_str, ¤t_mode);
|
sscanf("%d", current_mode_str, ¤t_mode);
|
||||||
|
|
||||||
const int new_mode = get_next_mode(current_mode);
|
const int new_mode = get_next_mode(current_mode);
|
||||||
printf("Current mode is set to %d -- switching to %d", current_mode, new_mode);
|
printf("Current mode is set to %d (read from %s) -- switching to %d", current_mode, current_mode_str, new_mode);
|
||||||
|
|
||||||
// end the current mode read
|
|
||||||
close(gamepad_mode_fd);
|
|
||||||
|
|
||||||
char new_mode_str[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
char new_mode_str[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
snprintf(new_mode_str, sizeof(new_mode_str) - 1, "%d", new_mode);
|
snprintf(new_mode_str, sizeof(new_mode_str) - 1, "%d", new_mode);
|
||||||
gamepad_mode_fd = open(tmp_path, O_RDONLY);
|
gamepad_mode_fd = open(tmp_path, O_WRONLY);
|
||||||
if (gamepad_mode_fd > 0) {
|
if (gamepad_mode_fd > 0) {
|
||||||
if (write(gamepad_mode_fd, new_mode_str, strlen(new_mode_str)) > 0) {
|
if (write(gamepad_mode_fd, new_mode_str, strlen(new_mode_str)) > 0) {
|
||||||
printf("Controller mode switched successfully to %d\n", new_mode);
|
printf("Controller mode switched successfully to %s\n", new_mode_str);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Unable to switch controller mode: %d -- expect bugs\n", errno);
|
fprintf(stderr, "Unable to switch controller mode to %s: %d -- expect bugs\n", new_mode_str, errno);
|
||||||
}
|
}
|
||||||
close(gamepad_mode_fd);
|
close(gamepad_mode_fd);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
41
virt_mouse.c
41
virt_mouse.c
|
|
@ -69,34 +69,32 @@ int virt_mouse_get_fd(virt_mouse_t *const mouse) {
|
||||||
int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, struct timeval *const now) {
|
int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, struct timeval *const now) {
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
|
struct timeval syn_time;
|
||||||
|
gettimeofday(&syn_time, NULL);
|
||||||
|
|
||||||
struct input_event tmp_ev;
|
struct input_event tmp_ev;
|
||||||
if (now == NULL) {
|
gettimeofday(&tmp_ev.time, NULL);
|
||||||
gettimeofday(&tmp_ev.time, NULL);
|
if (now != NULL) {
|
||||||
} else {
|
|
||||||
tmp_ev.time = *now;
|
tmp_ev.time = *now;
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_ev.type = EV_REL;
|
tmp_ev.type = EV_REL;
|
||||||
|
|
||||||
if (status->x > 0) {
|
if (status->x != 0) {
|
||||||
tmp_ev.code = REL_X;
|
tmp_ev.code = REL_X;
|
||||||
tmp_ev.value = status->x;
|
tmp_ev.value = status->x;
|
||||||
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) {
|
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) {
|
||||||
res = errno < 0 ? errno : -1 * errno;
|
res = errno < 0 ? errno : -1 * errno;
|
||||||
goto virt_mouse_send_err;
|
goto virt_mouse_send_err;
|
||||||
} else {
|
|
||||||
status->x = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status->y > 0) {
|
if (status->y != 0) {
|
||||||
tmp_ev.code = REL_Y;
|
tmp_ev.code = REL_Y;
|
||||||
tmp_ev.value = status->y;
|
tmp_ev.value = status->y;
|
||||||
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) {
|
if (write(mouse->fd, &tmp_ev, sizeof(tmp_ev)) != sizeof(struct input_event)) {
|
||||||
res = errno < 0 ? errno : -1 * errno;
|
res = errno < 0 ? errno : -1 * errno;
|
||||||
goto virt_mouse_send_err;
|
goto virt_mouse_send_err;
|
||||||
} else {
|
|
||||||
status->y = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,6 +130,31 @@ int virt_mouse_send(virt_mouse_t *const mouse, mouse_status_t *const status, str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
const struct input_event timestamp_ev = {
|
||||||
|
.code = MSC_TIMESTAMP,
|
||||||
|
.type = EV_MSC,
|
||||||
|
.value = (now.tv_sec - secAtInit)*1000000 + (now.tv_usec - usecAtInit),
|
||||||
|
.time = now,
|
||||||
|
};
|
||||||
|
const ssize_t timestamp_written = write(fd, (void*)×tamp_ev, sizeof(timestamp_ev));
|
||||||
|
if (timestamp_written != sizeof(timestamp_ev)) {
|
||||||
|
fprintf(stderr, "Error in sync: written %ld bytes out of %ld\n", timestamp_written, sizeof(timestamp_ev));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
syn_time.tv_usec += 1;
|
||||||
|
const struct input_event syn_ev = {
|
||||||
|
.code = SYN_REPORT,
|
||||||
|
.type = EV_SYN,
|
||||||
|
.value = 0,
|
||||||
|
.time = syn_time,
|
||||||
|
};
|
||||||
|
const ssize_t sync_written = write(mouse->fd, (void*)&syn_ev, sizeof(syn_ev));
|
||||||
|
if (sync_written != sizeof(syn_ev)) {
|
||||||
|
fprintf(stderr, "Error in sync: written %ld bytes out of %ld\n", sync_written, sizeof(syn_ev));
|
||||||
|
}
|
||||||
|
|
||||||
virt_mouse_send_err:
|
virt_mouse_send_err:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue