Skip to content

Commit

Permalink
added multi controller support
Browse files Browse the repository at this point in the history
  • Loading branch information
helloparthshah committed Jul 29, 2022
1 parent 2498beb commit 3884e44
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 83 deletions.
25 changes: 17 additions & 8 deletions server.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@
static_folder='static',
template_folder='templates')
sock = Sock(app)
gamepad = None

notif = None
# gamepad = None


def create_image():
Expand All @@ -35,17 +33,21 @@ def my_callback(client, target, large_motor, small_motor, led_number, user_data)
'led': led_number,
}
ws.send(json.dumps(notif))
global gamepad
# global gamepad
gamepad = None
if gamepad == None:
gamepad = vg.VX360Gamepad()
gamepad.register_notification(callback_function=my_callback)
while True:
if not ws.connected:
gamepad.close()
print("Disconnected")
gamepad.unregister_notification()
del gamepad
gamepad = None
break
message = ws.receive()
if message.startswith('{'):
ws.close()
return
message = ws.receive(0.1)
if message and message.startswith('{'):
message = json.loads(message)
gamepad.left_joystick(
int(message['lx']*32767), -int(message['ly']*32767))
Expand Down Expand Up @@ -133,6 +135,13 @@ def my_callback(client, target, large_motor, small_motor, led_number, user_data)
gamepad.release_button(
button=vg.XUSB_BUTTON.XUSB_GAMEPAD_GUIDE)
gamepad.update()
elif message and message == 'disconnect':
print("Disconnected")
gamepad.unregister_notification()
del gamepad
gamepad = None
ws.close()
return


@app.route('/')
Expand Down
142 changes: 71 additions & 71 deletions static/script.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,8 @@
var noSleep = new NoSleep();

document.addEventListener('click', function enableNoSleep() {
document.removeEventListener('click', enableNoSleep, false);
noSleep.enable();
}, false);

const sections = {
pending: document.getElementById('Pending'),
active: document.getElementById('Active'),
};

let gamepadIndex;
window.addEventListener('gamepadconnected', (event) => {
sections.pending.classList.remove('visible');
sections.active.classList.add('visible');
noSleep.enable();
gamepadIndex = event.gamepad.index;
});

window.addEventListener('gamepaddisconnected', () => {
sections.active.classList.remove('visible');
sections.pending.classList.add('visible');
noSleep.disable();
gamepadIndex = undefined;
});

const buttons = {
0: false,
1: false,
Expand Down Expand Up @@ -77,10 +55,57 @@ const buttonElems = {


let url = window.location.href.replace("http", "ws");
let socket = new WebSocket(url + '/controller');
socket.onopen = function (e) {
console.log("[open] Connection established");
};

let gamepadIndex;
let socket
let connectSocket = () => {
socket = new WebSocket(url + '/controller');
socket.onopen = function (e) {
console.log("[open] Connection established");
};
socket.onmessage = function (event) {
console.log(`[message] Data received from server: ${event.data}`);
let data = JSON.parse(event.data);
console.log(data.lm);
console.log(data.sm);
// vibrate controller
if (gamepadIndex !== undefined) {
vibrate(data).then(() => {
if (data.lm > 0 || data.sm > 0) {
vibrate(data);
}
});
}
};

socket.onclose = function (event) {
connected = false;
if (event.wasClean) {
console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
console.log('[close] Connection died');
}
};

socket.onerror = function (error) {
console.log(`[error] ${error.message}`);
};
}

connectSocket();
window.addEventListener('gamepadconnected', (event) => {
sections.pending.classList.remove('visible');
sections.active.classList.add('visible');
gamepadIndex = 0;
});

window.addEventListener('gamepaddisconnected', () => {
sections.active.classList.remove('visible');
sections.pending.classList.add('visible');
gamepadIndex = undefined;
});



let vibrate = async (data) => {
if (navigator.getGamepads()[gamepadIndex].vibrationActuator)
Expand All @@ -92,34 +117,6 @@ let vibrate = async (data) => {
});
}

socket.onmessage = function (event) {
console.log(`[message] Data received from server: ${event.data}`);
let data = JSON.parse(event.data);
console.log(data.lm);
console.log(data.sm);
// vibrate controller
if (gamepadIndex !== undefined) {
vibrate(data).then(() => {
if (data.lm > 0 || data.sm > 0) {
vibrate(data);
}
});
}
};

socket.onclose = function (event) {
connected = false;
if (event.wasClean) {
console.log(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
console.log('[close] Connection died');
}
};

socket.onerror = function (error) {
console.log(`[error] ${error.message}`);
};

const updateController = () => {
for (let buttonIndex = 0; buttonIndex < 19; buttonIndex++) {
const buttonValue = buttons[buttonIndex];
Expand All @@ -145,23 +142,26 @@ const updateController = () => {
const update = () => {
if (gamepadIndex !== undefined) {
const myGamepad = navigator.getGamepads()[gamepadIndex];
buttons["lx"] = myGamepad.axes[0];
buttons["ly"] = myGamepad.axes[1];
buttons["rx"] = myGamepad.axes[2];
buttons["ry"] = myGamepad.axes[3];

myGamepad.buttons.map(e => e.pressed).forEach((isPressed, buttonIndex) => {
if (buttonIndex == 6 || buttonIndex == 7) {
buttons[buttonIndex] = myGamepad.buttons[buttonIndex].value;
}
else if (isPressed) {
buttons[buttonIndex] = true;
} else {
buttons[buttonIndex] = false;
}
})
updateController();
socket.send(JSON.stringify(buttons));
if (myGamepad) {
buttons["lx"] = myGamepad.axes[0];
buttons["ly"] = myGamepad.axes[1];
buttons["rx"] = myGamepad.axes[2];
buttons["ry"] = myGamepad.axes[3];

myGamepad.buttons.map(e => e.pressed).forEach((isPressed, buttonIndex) => {
if (buttonIndex == 6 || buttonIndex == 7) {
buttons[buttonIndex] = myGamepad.buttons[buttonIndex].value;
}
else if (isPressed) {
buttons[buttonIndex] = true;
} else {
buttons[buttonIndex] = false;
}
})
updateController();
if (socket.readyState == 1)
socket.send(JSON.stringify(buttons));
}
}
}

Expand Down
4 changes: 0 additions & 4 deletions templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,6 @@ <h2>Controller Connected</h2>
</p>
</footer>

<script src="https://cdn.jsdelivr.net/npm/eruda"></script>
<script>
eruda.init();
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.socket.io/4.5.0/socket.io.min.js"
integrity="sha384-7EyYLQZgWBi67fBtVxw60/OWl1kjsfrPFcaU0pp0nAh+i8FD068QogUvg85Ewy1k"
Expand Down
Binary file modified vgamepad/__pycache__/__init__.cpython-39.pyc
Binary file not shown.
Binary file modified vgamepad/win/__pycache__/__init__.cpython-39.pyc
Binary file not shown.
Binary file modified vgamepad/win/__pycache__/vigem_client.cpython-39.pyc
Binary file not shown.
Binary file modified vgamepad/win/__pycache__/vigem_commons.cpython-39.pyc
Binary file not shown.
Binary file modified vgamepad/win/__pycache__/virtual_gamepad.cpython-39.pyc
Binary file not shown.

0 comments on commit 3884e44

Please sign in to comment.