Exemple #1
0
int set_sixaxis_led(int csk, struct dev_led led, int rumble)
{
    int led_n, led_number;

#if !defined(GASIA_GAMEPAD_HACKS) || defined(SHANWAN_FAKE_DS3)
    unsigned char buf[128];
#endif

    unsigned char setleds[] = {
#ifdef GASIA_GAMEPAD_HACKS
        0x92,
#else
        0x52, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUTPUT */
#endif
        0x01,
        0x00, 0x00, 0x00, 0x00, 0x00,   // rumble values [0x00, right-timeout, right-force, left-timeout, left-force]
        0x00, 0x00, 0x00, 0x00, 0x1E,   // 0x02=LED1 .. 0x10=LED4
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 4
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 3
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 2
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 1
        0x00, 0x00, 0x00, 0x00, 0x00
    };
    const unsigned char ledpattern[11] = {
        0x00,
        0x02, 0x04, 0x08, 0x10, // 1, 2, 3, 4
        0x12, 0x14, 0x18, 0x1A, // 5, 6, 7, 8
        0x1C, 0x1E  // 9, 10
    };

    if (led.enabled) {
        if (led.auto_sel)
            led_number = get_joystick_number();
        else
            led_number = led.number;

        if (led_number < 1) {
            led_n = 1;
        } else if (led_number > 10) {
            led_n = 10;
        } else {
            led_n = led_number;
        }
    } else
        led_n = 0;

#ifndef GASIA_GAMEPAD_HACKS
    if (led.enabled && led.anim)
    {
        /* Sixaxis LED animation - Way Cool!! */
        if (rumble) setleds[3] = setleds[5] = 0xfe;
        for (int i=0; i<4; i++) {  // repeat it 4 times
            if (rumble) setleds[4] = setleds[6] = 0xff;
            setleds[11] = ledpattern[1];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(10000);
            setleds[11] = ledpattern[2];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(5000);
            setleds[11] = ledpattern[3];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(5000);
            setleds[11] = ledpattern[4];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(10000);
            setleds[11] = ledpattern[3];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(5000);
            setleds[11] = ledpattern[2];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(5000);
        }
        /* 2nd part of animation (animate until LED reaches selected number) */
        if (led_n == 2 || led_n == 6 || led_n == 9)
        {
            setleds[11] = ledpattern[1];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
        }
        else if (led_n == 3 || led_n == 7)
        {
            setleds[11] = ledpattern[1];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(10000);
            setleds[11] = ledpattern[2];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
        }
        else if (led_n == 4 || led_n == 8)
        {
            setleds[11] = ledpattern[1];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(100000);
            setleds[11] = ledpattern[2];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
            usleep(50000);
            setleds[11] = ledpattern[3];
            send(csk, setleds, sizeof(setleds), 0);
            recv(csk, buf, sizeof(buf), 0);
        }
    }
#endif

    /* set LEDs (final) */
    setleds[11] = ledpattern[led_n];
    if (rumble) setleds[3] = setleds[4] = setleds[5] = setleds[6] = 0x00;
    send(csk, setleds, sizeof(setleds), 0);
#if !defined(GASIA_GAMEPAD_HACKS) || defined(SHANWAN_FAKE_DS3)
    recv(csk, buf, sizeof(buf), 0);
#endif

    return led_n;
}
Exemple #2
0
int set_sixaxis_led(int csk, struct dev_led led, int rumble)
{
    int led_n, led_number;
    
    const unsigned char ledpattern[11] = {
        0x00,
        0x02, 0x04, 0x08, 0x10, // 1, 2, 3, 4
        0x12, 0x14, 0x18, 0x1A, // 5, 6, 7, 8
        0x1C, 0x1E  // 9, 10
    };


    unsigned char setleds_orig[] = {
        0x52, /* HIDP_TRANS_SET_REPORT | HIDP_DATA_RTYPE_OUTPUT */
        0x01,
        0x00, 0x00, 0x00, 0x00, 0x00,   // rumble values [0x00, right-timeout, right-force, left-timeout, left-force]
        0x00, 0x00, 0x00, 0x00, 0x1E,   // 0x02=LED1 .. 0x10=LED4
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 4
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 3
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 2
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 1
        0x00, 0x00, 0x00, 0x00, 0x00
    };

    unsigned char setleds_gasia[] = {
        0x92,
        0x01,
        0x00, 0x00, 0x00, 0x00, 0x00,   // rumble values [0x00, right-timeout, right-force, left-timeout, left-force]
        0x00, 0x00, 0x00, 0x00, 0x1E,   // 0x02=LED1 .. 0x10=LED4
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 4
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 3
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 2
        0xff, 0x27, 0x10, 0x00, 0x32,   // LED 1
        0x00, 0x00, 0x00, 0x00, 0x00
    };

    if (led.enabled) {
        if (led.auto_sel)
            led_number = get_joystick_number();
        else
            led_number = led.number;

        if (led_number < 1) {
            led_n = 1;
        } else if (led_number > 10) {
            led_n = 10;
        } else {
            led_n = led_number;
        }
    } else
        led_n = 0;

    if (led.enabled && led.anim)
    {
        /* Sixaxis LED animation - Way Cool!! */
        if (rumble)
        {
            setleds_orig[3] = setleds_orig[5] = 0xfe;
            setleds_gasia[3] = setleds_gasia[5] = 0xfe;
        }
        int i;
        for (i=0; i<2; i++) {  // repeat it 2 times (used to be 4, but takes too long if hitting timeout)
            if (rumble)
            {
                setleds_orig[4] = setleds_orig[6] = 0xff;
                setleds_gasia[4] = setleds_gasia[6] = 0xff;
            }
            setleds_orig[11] = ledpattern[1];
            setleds_gasia[11] = ledpattern[1];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(10000);
            setleds_orig[11] = ledpattern[2];
            setleds_gasia[11] = ledpattern[2];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(5000);
            setleds_orig[11] = ledpattern[3];
            setleds_gasia[11] = ledpattern[3];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(5000);
            setleds_orig[11] = ledpattern[4];
            setleds_gasia[11] = ledpattern[4];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(10000);
            setleds_orig[11] = ledpattern[3];
            setleds_gasia[11] = ledpattern[3];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(5000);
            setleds_orig[11] = ledpattern[2];
            setleds_gasia[11] = ledpattern[2];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(5000);
        }
        /* 2nd part of animation (animate until LED reaches selected number) */
        if (led_n == 2 || led_n == 6 || led_n == 9)
        {
            setleds_orig[11] = ledpattern[1];
            setleds_gasia[11] = ledpattern[1];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
        }
        else if (led_n == 3 || led_n == 7)
        {
            setleds_orig[11] = ledpattern[1];
            setleds_gasia[11] = ledpattern[1];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(10000);
            setleds_orig[11] = ledpattern[2];
            setleds_gasia[11] = ledpattern[2];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
        }
        else if (led_n == 4 || led_n == 8)
        {
            setleds_orig[11] = ledpattern[1];
            setleds_gasia[11] = ledpattern[1];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(100000);
            setleds_orig[11] = ledpattern[2];
            setleds_gasia[11] = ledpattern[2];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
            usleep(50000);
            setleds_orig[11] = ledpattern[3];
            setleds_gasia[11] = ledpattern[3];
            send(csk, setleds_orig, sizeof(setleds_orig), 0);
            send(csk, setleds_gasia, sizeof(setleds_gasia), 0);
        }
        usleep(100000);
    }

    /* set LEDs (final) */
    setleds_orig[11] = ledpattern[led_n];
    if (rumble) setleds_orig[3] = setleds_orig[4] = setleds_orig[5] = setleds_orig[6] = 0x00;
    send(csk, setleds_orig, sizeof(setleds_orig), 0);

    setleds_gasia[11] = ledpattern[led_n];
    if (rumble) setleds_gasia[3] = setleds_gasia[4] = setleds_gasia[5] = setleds_gasia[6] = 0x00;
    send(csk, setleds_gasia, sizeof(setleds_gasia), 0);

    return led_n;
}