/* a little test program */ int main(int argc, char *argv[]) { int fd, rc; int done = 0; struct js_event jse; fd = open_joystick(); if (fd < 0) { perror("open_joystick"); exit(1); } while (!done) { rc = read_joystick_event(&fd, &jse); usleep(1000); if (rc == 1) { printf("Event: time %8u, value %8hd, type: %3u, axis/button: %u\n", jse.time, jse.value, jse.type, jse.number); } } }
void * JoystickPollingLoop(void *ptr ) { int fd, rc; struct js_event jse; fd = open_joystick(joystick_device); if (fd < 0) { printf("joystick open failed.\n"); STOP_JOYSTICK_THREAD=1; return 0; } JOYSTICK_OK=1; while ( !STOP_JOYSTICK_THREAD ) { rc = read_joystick_event(&jse); usleep(1000); if (rc == 1) { //printf("Event: time %8u, value %8hd, type: %3u, axis/button: %u\n",jse.time, jse.value, jse.type, jse.number); HandleJoystickEvent(&jse); } } JOYSTICK_OK=0; return 0; }
int get_joystick_status(int *joystick_fd, struct wwvi_js_event *wjse) { struct js_event jse; int bytes_read; if (*joystick_fd < 0) return -1; // memset(wjse, 0, sizeof(*wjse)); bytes_read = read_joystick_event(joystick_fd, &jse); if(bytes_read <= 0) return bytes_read; //jse.type &= ~JS_EVENT_INIT; /* ignore synthetic events */ if (jse.type == JS_EVENT_AXIS) { switch (jse.number) { case 0: wjse->stick_x = jse.value; break; case 1: wjse->stick_y = jse.value; break; case 2: wjse->stick_z = jse.value; break; default: break; } } else if (jse.type == JS_EVENT_BUTTON) { if (jse.number < 10) { switch (jse.value) { case 0: case 1: wjse->button[jse.number] = jse.value; break; default: break; } } } return bytes_read; }
/* * Joystick update function * it accepts a void pointer */ void joystick_update ( void *ptr ) { thdata *jdata; jdata = (thdata *) ptr; /* type cast to a pointer to thdata */ while(true) { rc = read_joystick_event(&jse); usleep(1000); if (rc == 1) { //printf("Event: time %8u, value %8hd, type: %3u, axis/button: %u\n", //jse.time, jse.value, jse.type, jse.number); if (jse.type == 2 && jse.number == 0) { joystick_x = jse.value; relevant = true; //printf("X axis\n"); } else if (jse.type == 2 && jse.number == 1) { joystick_y = jse.value; relevant = true; //printf("Y axis\n"); } else if (jse.type == 2 && jse.number == 3) { joystick_z = jse.value; relevant = true; //printf("Z axis\n"); } else if (jse.value == 1 && jse.type == 1 && jse.number == 0) { fire_pressed = true; relevant = true; //printf("Fire button\n"); } else if (jse.value == 0 && jse.type == 1 && jse.number == 0) { fire_pressed = false; relevant = true; } else relevant = false; } } }
int32_t get_joystick_status(int32_t joystick_file_descriptor, int32_t *axes, int32_t *buttons, int32_t axes_size, int32_t buttons_size) { int32_t rc; struct joystick_event event; if (joystick_file_descriptor < 0) return -1; while ((rc = read_joystick_event(joystick_file_descriptor, &event) == 1)) { event.type &= ~JS_INIT; if ((event.type == JS_AXIS) && (event.number>=0) &&(event.number<axes_size)) { axes[event.number] = event.value; } else if (event.type == JS_BUTTON) { if ((event.number < buttons_size)&& (event.number>=0)) { switch (event.value) { case 0:buttons[event.number] = event.value; break; case 1: print_util_dbg_print_num(event.number, 10);print_util_dbg_print(": ");print_util_dbg_print_num(event.value, 10);print_util_dbg_print("\n"); buttons[event.number] = event.value; switch (event.number) { case JOY_SAFETY_OFF_BUTTON: axes[RC_SAFETY]=-32000; break; case JOY_SAFETY_ON_BUTTON: axes[RC_SAFETY]= 32000; break; case JOY_MODE_1_BUTTON: axes[RC_ID_MODE]=-32000; break; case JOY_MODE_2_BUTTON: axes[RC_ID_MODE]= 0; break; case JOY_MODE_3_BUTTON: axes[RC_ID_MODE]= 32000; break; } break; default: break; } } } } return 0; }
int get_joystick_status(struct wwvi_js_event *wjse) { int rc; struct js_event jse; if (joystick_fd < 0) return -1; // memset(wjse, 0, sizeof(*wjse)); while ((rc = read_joystick_event(&jse) == 1)) { jse.type &= ~JS_EVENT_INIT; /* ignore synthetic events */ if (jse.type == JS_EVENT_AXIS) { switch (jse.number) { case 0: wjse->stick1_x = jse.value; break; case 1: wjse->stick1_y = jse.value; break; case 2: wjse->stick2_x = jse.value; break; case 3: wjse->stick2_y = jse.value; break; default: break; } } else if (jse.type == JS_EVENT_BUTTON) { if (jse.number < 10) { switch (jse.value) { case 0: case 1: wjse->button[jse.number] = jse.value; break; default: break; } } } } // printf("%d\n", wjse->stick1_y); return 0; }
void zczytuj_joystick() { rc = read_joystick_event(&jse); usleep(100); if (rc == 1) { /* Mode 1 – Kierunek / Wysokość Lotki / Gaz Mode 2 – Kierunek / Gaz Lotki / Wysokość Mode 3 – Lotki / Wysokość Kierunek / Gaz Mode 4 – Lotki / Gaz Kierunek / Wysokość */ if (jse.type == JS_EVENT_AXIS) { if (jse.number == axis[0]) { /* rudder */ if (abs(jse.value) > deadzone_x1) { stick_x = jse.value; wyslij_stick(0, stick_x); printf("oś: %d wychylenie %d\n", jse.number, stick_x); } else { if (abs(stick_x) < deadzone_x1) { stick_x = 0; wyslij_stick(0, stick_x); printf("oś: %d wychylenie %d (dead zone)\n", jse.number, stick_x); } } sprintf(wychylenie_x, "%+06d", stick_x); gtk_markup(jse.number, wychylenie_x); } else if (jse.number == axis[1]) { if (r2_throttle == TRUE) { /* right analog button works as throttle */ if (abs(jse.value) > deadzone_y1) { stick_y = jse.value; //wyslij_stick(5, stick_y); //printf("oś: %d wychylenie (does nothing)%d\n", jse.number, jse.value); } else { if (abs(stick_y) < deadzone_y1) { stick_y = 0; //wyslij_stick(5, stick_y); //printf("oś: %d wychylenie %d (does nothing, dead zone)\n", jse.number, jse.value); } } sprintf(wychylenie_y, "%+06d", stick_y); gtk_markup(jse.number, wychylenie_y); } else { /* right analog button doesn't work as throttle */ stick_y = jse.value; if (stick_y > 0) { /* pull stick closer: half range */ throttle = stick_y - 32768; } else { /* push stick away: full range */ throttle = -stick_y * 2 - 32768; } sprintf(wychylenie_y, "%+06d", throttle); gtk_markup(jse.number, wychylenie_y); wyslij_stick(4, throttle); gtk_progress_bar_set_fraction(progress2, throttle * 0.000015259 + 0.5); } } else if (jse.number == axis[3]) { /* aileron */ if (isExponential) { stick_x2 = expo((double) jse.value); wyslij_stick(2, stick_x2); sprintf(wychylenie_x2, "X: %+06d", stick_x2); printf("oś: %d wychylenie %d (expo: %d)\n", jse.number, jse.value, stick_x2); } else { /* linear mode */ stick_x2 = jse.value; wyslij_stick(2, stick_x2); sprintf(wychylenie_x2, "X: %+06d", stick_x2); printf("oś: %d wychylenie %d\n", jse.number, jse.value); } gtk_label_set_text(label_x2, wychylenie_x2); } else if (jse.number == 2) { /* left analog trigger (flaps) */ stick_l2 = jse.value; printf("oś: %d wychylenie %d\n", jse.number, jse.value); wyslij_stick(3, jse.value); gtk_progress_bar_set_fraction(progress1, jse.value * 0.000015259 + 0.5); } else if (jse.number == axis[4]) { /* elevator */ if (isExponential) { /* exponential mode */ stick_y2 = expo((double) jse.value); wyslij_stick(1, stick_y2); sprintf(wychylenie_y2, "Y: %+06d", stick_y2); printf("oś: %d wychylenie %d (expo: %d)\n", jse.number, jse.value, stick_y2); } else { /* linear mode */ stick_y2 = jse.value; wyslij_stick(1, stick_y2); sprintf(wychylenie_y2, "Y: %+06d", stick_y2); printf("oś: %d wychylenie %d\n", jse.number, jse.value); } gtk_label_set_text(label_y2, wychylenie_y2); } else if (jse.number == 5) { /* right analog trigger */ if (r2_throttle && r2_pressed == TRUE) { stick_r2 = jse.value; throttle = jse.value; printf("oś: %d wychylenie %d\n", jse.number, throttle); wyslij_stick(4, throttle); gtk_progress_bar_set_fraction(progress2, jse.value * 0.000015259 + 0.5); } } else if (jse.number == axis[6]) { /* mapping depends on connection type (USB/Bluetooth) */ stick_6 = jse.value; if(stick_6 == 0) { //push_item(statusbar, GINT_TO_POINTER(context_id), ""); } else if(stick_6 > 0) { //printf("rudder trim increased\n"); wyslij_stick(6, -stick_6); } else if(stick_6 < 0) { //printf("rudder trim decreased\n"); wyslij_stick(6, -stick_6); } } else if (jse.number == axis[7]) { /* mapping depends on connection type (USB/Bluetooth) */ stick_7 = jse.value; if(stick_7 == 0) { //push_item(statusbar, GINT_TO_POINTER(context_id), ""); } else if(stick_7 > 0) { //printf("elevator trim +10\n"); wyslij_stick(7, stick_7); } else if(stick_7 < 0) { //printf("elevator trim -10\n"); wyslij_stick(7, stick_7); } } } if (jse.type == JS_EVENT_BUTTON) { /* button pressed */ if (jse.value == 1) { if (jse.number == button[0]) {/* DS4 "X" */ /* pitch stabilization disabled */ wyslij_dwustan(0, 1); //play_rumble_effect(RUMBLE_STRONG_RUMBLE_EFFECT); } else if (jse.number == button[1]) {/* DS4 "circle" */ /* roll stabilization disabled */ wyslij_dwustan(1, 1); //play_rumble_effect(RUMBLE_STRONG_RUMBLE_EFFECT); } else if (jse.number == button[2]) {/* DS4 "triangle" */ /* roll stabilization enabled */ wyslij_dwustan(2, 1); //play_rumble_effect(RUMBLE_STRONG_RUMBLE_EFFECT); } else if (jse.number == button[3]) {/* DS4 "square" */ /* pitch stabilization enabled */ wyslij_dwustan(3, 1); //play_rumble_effect(RUMBLE_STRONG_RUMBLE_EFFECT); } else if (jse.number == button[4]) {/* DS4 L1 */ switch_Recording(); //play_rumble_effect(RUMBLE_STRONG_RUMBLE_EFFECT); } else if (jse.number == button[5]) {/* DS4 R1 */ wyslij_dwustan(5, 1); //play_rumble_effect(RUMBLE_STRONG_RUMBLE_EFFECT); } else if (jse.number == button[6]) {/* DS4 L2 "button" */} else if (jse.number == button[7]) {/* DS4 R2 "button" */} else if (jse.number == button[8]) {/* DualShock 3: Select button, DualShock 4: Share button */ switch_Shining(); //wyslij_dwustan(8, 1); } else if (jse.number == button[9]) {/* DualShock 3: Start button, DualShock 4: Options button */ wyslij_dwustan(9, 1); } else if (jse.number == button[10]) {printf("PlayStation button pressed\n");} else if (jse.number == button[11]) {/* left knob press */ printf("left knob pressed\n"); /* if (r2_throttle == TRUE) { r2_throttle = FALSE; gtk_statusbar_push(statusbar, GINT_TO_POINTER(context_id), "throttle controlled by stick's vertical axis"); } */ } else if (jse.number == button[12]) {/* right knob press */ printf("right knob pressed\n"); /* if (r2_throttle == FALSE) { r2_throttle = TRUE; gtk_statusbar_push(statusbar, GINT_TO_POINTER(context_id), "throttle controlled by R2 analog trigger"); } */ } else {printf("button %u pressed\n", jse.number);} if (buttons_ever_pressed == FALSE) {buttons_ever_pressed = TRUE;} } /* button released */ if (jse.value == 0 && buttons_ever_pressed) { if (jse.number == button[0]) { wyslij_dwustan(0, 0); //stop_all_rumble_effects(); } else if (jse.number == button[1]) { wyslij_dwustan(1, 0); //stop_all_rumble_effects(); } else if (jse.number == button[2]) { wyslij_dwustan(2, 0); //stop_all_rumble_effects(); } else if (jse.number == button[3]) { wyslij_dwustan(3, 0); //stop_all_rumble_effects(); } else if (jse.number == button[4]) { //stop_all_rumble_effects(); } else if (jse.number == button[5]) { wyslij_dwustan(5, 0); //stop_all_rumble_effects(); } else if (jse.number == button[6]) {} else if (jse.number == button[7]) { //stop_all_rumble_effects(); } else if (jse.number == button[8]) { /* DualShock 3: Select button, DualShock 4: Share button */ //wyslij_dwustan(8, 0); } else if (jse.number == button[9]) {/* DualShock 3: Start button, DualShock 4: Options button */ wyslij_dwustan(9, 0); } else if (jse.number == button[10]) {printf("PlayStation button released\n");} else if (jse.number == button[11]) {printf("left knob released\n");} else if (jse.number == button[12]) {printf("right knob released\n");} else {printf("button %u released\n", jse.number);} } } if (jse.type == JS_EVENT_INIT) { printf("Stan początkowy joysticka.\n"); } } }
/* a little test program */ int processaJoystick(int *buttons, struct js_event* jse) { int rc; rc = read_joystick_event(jse); //usleep(1000); if (rc == 1) { if(jse->type == JS_EVENT_BUTTON) { if(jse->value == 1) { //printf("Button pressed\n"); //printf("Event: Value %hd, type: %u, axis/button: %u\n", jse->value, jse->type, jse->number); buttons[jse->number] = 1; } else if(jse->value == 0) { //printf("Button released\n"); //printf("Event: Value %hd, type: %u, axis/button: %u\n", jse->value, jse->type, jse->number); buttons[jse->number] = 0; } } else if(jse->type == JS_EVENT_AXIS) { if(jse->number == 5) { //printf("3st Axis X\n"); if(jse->value != 0) { //printf("Directional pressed\n"); //printf("Event: Value %hd, type: %u, axis/button: %u\n", jse->value, jse->type, jse->number); if(jse->value == 32767) { buttons[9] = 1; } else if(jse->value == -32767) { buttons[11] = 1; } } else if(jse->value == 0) { //printf("Directional released\n"); //printf("Event: Value %hd, type: %u, axis/button: %u\n", jse->value, jse->type, jse->number); if(jse->number == 5) { buttons[9] = buttons[11] = 0; } } } else if(jse->number == 6) { if(jse->value != 0) { //printf("Directional pressed\n"); //printf("Event: Value %hd, type: %u, axis/button: %u\n", jse->value, jse->type, jse->number); if(jse->value == -32767) { buttons[8] = 1; } else if(jse->value == 32767) { buttons[10] = 1; } } else { //printf("Directional released\n"); //printf("Event: Value %hd, type: %u, axis/button: %u\n", jse->value, jse->type, jse->number); if(jse->number == 6) { buttons[8] = buttons[10] = 0; } } } } /* else if(jse->type == JS_EVENT_INIT) { //printf("Initial state\n"); } else { //printf("UNDEFINED STATE %d\n",jse->type); } */ } return 0; }
/* a little test program */ int main(int argc, char *argv[]) { int joy_file, received, serial_file; int done = 0; char joy_address[32] = "/dev/input/\0"; int axis_values[8] = {0}; int button_values[11] = {0}; struct js_event jse; if(argc > 2) { printf("Too many arguments, exiting."); return 0; } if(argc == 2) { strcat(joy_address, argv[1]); joy_file = open_joystick(joy_address); } else if(argc == 1) { joy_file = open_joystick("/dev/input/js0"); } if (joy_file < 0) { printf("Joystick open failed.\n"); exit(1); } serial_file = serialport_init(ARDUINO_COMM_LOCATION, ROBOT_BAUDRATE); if(serial_file < 0) { printf("Can't open serial port."); exit(2); } clearPort(serial_file); while (!done) { received = read_joystick_event(&jse); usleep(1000); if (received == 1) { switch(jse.type) { case TYPE_NOT_BUTTON: if(axis_values[jse.number] != jse.value) axis_values[jse.number] = jse.value; break; case TYPE_BUTTON: if(button_values[jse.number] != jse.value) { button_values[jse.number] = jse.value; send_button_update(&jse, serial_file); } break; } } } }