Skip to content
Snippets Groups Projects
Gamepad.c 3.37 KiB

#include "inc/Gamepad.h"

// constants
const char* GP_DEVICE_NAME = "/dev/input/js0";

// variables
volatile union input_events ie; // stores the button values

// worker
GEN_TYPE_boolean gp_is_running = true;

void* gp_worker(void* pt_args) {
    int fd;
    fd = open(GP_DEVICE_NAME, O_RDONLY);

    if(fd <= 0) {
        perror("Error while connecting to gamepad device");
        return NULL;
    }

    struct timeval timeout;
    struct js_event jse;
    fd_set read_fds, write_fds, except_fds;

    // loop until terminated...
    while(gp_is_running) {
        FD_ZERO(&read_fds);
        FD_ZERO(&write_fds);
        FD_ZERO(&except_fds);
        FD_SET(fd, &read_fds);

        timeout.tv_sec = 0;
        timeout.tv_usec = 25000;

        if (select(fd + 1, &read_fds, &write_fds, &except_fds, &timeout) == 1) {
            if(read(fd,&jse,sizeof(jse)) == sizeof(jse)) {
                jse.type &= ~JS_EVENT_INIT;

                if(jse.type == JS_EVENT_AXIS) {
                    ie.inps[jse.number] = jse.value;

                    #ifdef DEBUG
                    printf("Axis %d %d\n", jse.number, jse.value);
                    #endif // DEBUG
                }

                if(jse.type == JS_EVENT_BUTTON) {
                    ie.inps[jse.number + 6] = jse.value;

                    #ifdef DEBUG
                    printf("Button %d %d\n",jse.number, jse.value);
                    #endif // DEBUG
                }
            }
        }
    }

    close(fd);

    return NULL;
}

// init, term
GEN_TYPE_boolean gp_initialized = false;
GEN_TYPE_boolean gp_terminated = false;

void gp_init() {
    // important, since all btns are accessing the same method
    if(gp_initialized) return;

    gp_initialized = true;
    // TODO initialize...
}

void gp_term() {
    // important, since all btns are accessing the same method
    if(gp_terminated) return;

    gp_terminated = false;
    gp_is_running = false;
}

// readers
GEN_TYPE_boolean gp_btn1_read() {
    return ie.btns.bt_tri;
}

GEN_TYPE_boolean gp_btn2_read() {
    return ie.btns.bt_cir;
}

GEN_TYPE_boolean gp_btn3_read() {
    return ie.btns.bt_x;
}

GEN_TYPE_boolean gp_btn4_read() {
    return ie.btns.bt_sqr;
}

GEN_TYPE_boolean gp_btnL1_read() {
    return ie.btns.bt_l1;
}

GEN_TYPE_boolean gp_btnL2_read() {
    return ie.btns.bt_l2;
}

GEN_TYPE_boolean gp_btnR1_read() {
    return ie.btns.bt_r1;
}

GEN_TYPE_boolean gp_btnR2_read() {
    return ie.btns.bt_r2;
}

GEN_TYPE_double gp_btnLX_read() {
    return ie.btns.js1_lr;
}

GEN_TYPE_double gp_btnLY_read() {
    return ie.btns.js1_ud;
}

GEN_TYPE_double gp_btnRX_read() {
    return ie.btns.js2_lr;
}

GEN_TYPE_double gp_btnRY_read() {
    return ie.btns.js1_ud;
}

// noval
GEN_TYPE_boolean gp_btn1_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btn2_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btn3_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btn4_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnL1_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnL2_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnR1_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnR2_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnLX_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnLY_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnRX_is_noval() {
    return false;
}

GEN_TYPE_boolean gp_btnRY_is_noval() {
    return false;
}