Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTML5 Gamepad API #18

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions index.css
Expand Up @@ -63,6 +63,8 @@ input[type=text] {

/*---------------------------------*/

.hidden { display: none; }

.gray { color:gray; }
.green { color:green; }
.orange { color:orange; }
Expand Down
28 changes: 22 additions & 6 deletions index.htm
Expand Up @@ -1487,16 +1487,17 @@
<div class="page" id="cfg_page_ports">
<table>
<tr>
<td class="arm">Mouse</td>
<td class="arm">Port 1</td>
<td>
<select id="cfg_ports_0" size="1" onchange="portUpdate(0)">
<option value="0">Disabled</option>
<option value="1">Mouse</option>
<option value="2">Joystick</option>
<option value="3">Emulated</option>
</select>
</td>
<td>
<div id="cfg_ports_0_grp">
<div id="cfg_ports_0_joyemu_grp">
Move
<select id="cfg_ports_0_move" size="1">
<option value="1">Arrows</option>
Expand Down Expand Up @@ -1556,19 +1557,27 @@
<option value="50">2</option>
</select>
</div>
<div id="cfg_ports_0_joy_grp" class="hidden">
Device
<select id="cfg_ports_0_joy_device" size="1">
<option value="0" disabled>No controllers detected</option>
<!-- Populated with connected gamepads via HTML5 Gamepad API -->
</select>
</div>
</td>
<td style="width:100%"></td>
</tr>
<tr>
<td class="arm">Game</td>
<td class="arm">Port 2</td>
<td>
<select id="cfg_ports_1" size="1" onchange="portUpdate(1)">
<option value="0">Disabled</option>
<option value="3">Joystick</option>
<option value="2">Joystick</option>
<option value="3">Emulated</option>
</select>
</td>
<td>
<div id="cfg_ports_1_grp">
<div id="cfg_ports_1_joyemu_grp">
Move
<select id="cfg_ports_1_move" size="1">
<option value="1">Arrows</option>
Expand Down Expand Up @@ -1628,6 +1637,13 @@
<option value="50">2</option>
</select>
</div>
<div id="cfg_ports_1_joy_grp" class="hidden">
Device
<select id="cfg_ports_1_joy_device" size="1">
<option value="" disabled>No controllers detected</option>
<!-- Populated with connected gamepads via HTML5 Gamepad API -->
</select>
</div>
</td>
<td style="width:100%"></td>
</tr>
Expand All @@ -1638,7 +1654,7 @@
</tr>
<tr>
<td class="arm"><input id="cfg_keyborad_enabled" type="checkbox" /></td>
<td class="alm" colspan="3">Enabled <span class="info">(joystick-emulation does always work)</span></td>
<td class="alm" colspan="3">Enabled <span class="info">(joystick-emulation doesn't always work)</span></td>
</tr>
<tr><td colspan="4"><div style="height:10px"></div></td></tr>
<tr>
Expand Down
91 changes: 79 additions & 12 deletions index.js
Expand Up @@ -1158,21 +1158,55 @@ function setAdvandedConfig() {
setSelect("cfg_ports_0_move", cfg.ports[0].move);
setSelect("cfg_ports_0_fire_1", cfg.ports[0].fire[0]);
setSelect("cfg_ports_0_fire_2", cfg.ports[0].fire[1]);
styleDisplayInline("cfg_ports_0_grp", cfg.ports[0].type == SAEC_Config_Ports_Type_Joy0);

styleDisplayInline("cfg_ports_0_joyemu_grp", cfg.ports[0].type == SAEC_Config_Ports_Type_JoyEmu);
styleDisplayInline("cfg_ports_0_joy_grp", cfg.ports[0].type == SAEC_Config_Ports_Type_Joy);
setAvailableGamepads('cfg_ports_0_joy_device');

setSelect("cfg_ports_1", cfg.ports[1].type);
setSelect("cfg_ports_1_move", cfg.ports[1].move);
setSelect("cfg_ports_1_fire_1", cfg.ports[1].fire[0]);
setSelect("cfg_ports_1_fire_2", cfg.ports[1].fire[1]);
styleDisplayInline("cfg_ports_1_grp", cfg.ports[1].type == SAEC_Config_Ports_Type_Joy1);

styleDisplayInline("cfg_ports_1_joyemu_grp", cfg.ports[1].type == SAEC_Config_Ports_Type_JoyEmu);
styleDisplayInline("cfg_ports_1_joy_grp", cfg.ports[1].type == SAEC_Config_Ports_Type_Joy);
setAvailableGamepads('cfg_ports_1_joy_device');

setCheckbox("cfg_keyborad_enabled", cfg.keyboard.enabled);

setCheckbox("cfg_serial_enabled", cfg.serial.enabled);

styleDisplayTableCell("controls_disk", 1);
}

function setAvailableGamepads( select_id ) {

var sel = document.getElementById(select_id);
if (sel) {
var gamepads = navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);

/* Clear list */
for(var i = sel.options.length - 1 ; i >= 0 ; i--) {sel.remove(i);};

/* Add gamepads */
for (i = 0; i < gamepads.length; i++) {
if (gamepads[i]) {
var opt = document.createElement('option');
opt.value = gamepads[i].index;
opt.innerHTML = gamepads[i].id + ' #' + i;
sel.appendChild(opt);
}
}


/* Add placeholder if no devices found */
if (sel.options.length == 0) {
var opt = document.createElement('option');
opt.value = '';
opt.innerHTML = 'Not Detected. Press a button on controller';
sel.appendChild(opt);
}
}
}

function getAdvandedFloppy() {
for (var n = 0; n < 4; n++) {
if (getCheckbox("cfg_df"+n+"_enabled")) {
Expand Down Expand Up @@ -1360,7 +1394,7 @@ function getAdvandedConfig() {

/* ports */
cfg.ports[0].type = getSelect("cfg_ports_0");
if (cfg.ports[0].type == SAEC_Config_Ports_Type_Joy0) {
if (cfg.ports[0].type == SAEC_Config_Ports_Type_JoyEmu) {
cfg.ports[0].move = getSelect("cfg_ports_0_move");
cfg.ports[0].fire[0] = getSelect("cfg_ports_0_fire_1");
cfg.ports[0].fire[1] = getSelect("cfg_ports_0_fire_2");
Expand All @@ -1369,8 +1403,12 @@ function getAdvandedConfig() {
return false;
}
}
if (cfg.ports[0].type == SAEC_Config_Ports_Type_Joy) {
cfg.ports[0].device = getSelect("cfg_ports_0_joy_device");
}

cfg.ports[1].type = getSelect("cfg_ports_1");
if (cfg.ports[1].type == SAEC_Config_Ports_Type_Joy1) {
if (cfg.ports[1].type == SAEC_Config_Ports_Type_JoyEmu) {
cfg.ports[1].move = getSelect("cfg_ports_1_move");
cfg.ports[1].fire[0] = getSelect("cfg_ports_1_fire_1");
cfg.ports[1].fire[1] = getSelect("cfg_ports_1_fire_2");
Expand All @@ -1379,7 +1417,13 @@ function getAdvandedConfig() {
return false;
}
}

if (cfg.ports[1].type == SAEC_Config_Ports_Type_Joy) {
cfg.ports[1].device = getSelect("cfg_ports_1_joy_device");
if (cfg.ports[0].type == SAEC_Config_Ports_Type_Joy && cfg.ports[1].device == cfg.ports[0].device) {
alert("Joystick device on port 2 can't be the same device used on port 1.");
return false;
}
}
cfg.keyboard.enabled = getCheckbox("cfg_keyborad_enabled");

cfg.serial.enabled = getCheckbox("cfg_serial_enabled");
Expand Down Expand Up @@ -2460,11 +2504,20 @@ function channelsUpdate() {
/*---------------------------------*/

function portUpdate(n) {
var v = getSelect("cfg_ports_"+n);
if (n == 0)
styleDisplayInline("cfg_ports_0_grp", v == SAEC_Config_Ports_Type_Joy0);
else
styleDisplayInline("cfg_ports_1_grp", v == SAEC_Config_Ports_Type_Joy1);
var v = getSelect("cfg_ports_" + n);
if (n == 0) {
styleDisplayInline("cfg_ports_0_joyemu_grp", v == SAEC_Config_Ports_Type_JoyEmu);
styleDisplayInline("cfg_ports_0_joy_grp", v == SAEC_Config_Ports_Type_Joy);
if (v == SAEC_Config_Ports_Type_Joy) {
setAvailableGamepads("cfg_ports_0_joy_device");
}
} else {
styleDisplayInline("cfg_ports_1_joyemu_grp", v == SAEC_Config_Ports_Type_JoyEmu);
styleDisplayInline("cfg_ports_1_joy_grp", v == SAEC_Config_Ports_Type_Joy);
if (v == SAEC_Config_Ports_Type_Joy) {
setAvailableGamepads("cfg_ports_1_joy_device");
}
}
}

/*-----------------------------------------------------------------------*/
Expand Down Expand Up @@ -2679,3 +2732,17 @@ function dskchgSelect() {
sae.insert(n);
}
}

/* Detect changes in connected gamepads/joysticks */
window.addEventListener("gamepadconnected", function(e) {
SAEF_log("New gamepad " + e.gamepad.id + " connected");
setAvailableGamepads('cfg_ports_0_joy_device');
setAvailableGamepads('cfg_ports_1_joy_device');
});
window.addEventListener("gamepaddisconnected", function(e) {
window.setTimeout(function(){
SAEF_log("Gamepad " + e.gamepad.id + " disconnected");
setAvailableGamepads('cfg_ports_0_joy_device');
setAvailableGamepads('cfg_ports_1_joy_device');
}, 100);
});
10 changes: 8 additions & 2 deletions sae/cia.js
Expand Up @@ -824,12 +824,18 @@ function SAEO_CIA() {
if (SAEV_config.ports[0].type == SAEC_Config_Ports_Type_Mouse) {
if (!SAER.input.mouse.button[0]) tmp |= 0x40;
if (dra & 0x40) tmp = (tmp & ~0x40) | (pra & 0x40);
} else if (SAEV_config.ports[0].type == SAEC_Config_Ports_Type_Joy0) {
} else if (
(SAEV_config.ports[0].type == SAEC_Config_Ports_Type_Joy) ||
(SAEV_config.ports[0].type == SAEC_Config_Ports_Type_JoyEmu)
) {
if (!SAER.input.joystick[0].button[0]) tmp |= 0x40;
if (dra & 0x40) tmp = (tmp & ~0x40) | (pra & 0x40);
} else tmp |= 0x40;

if (SAEV_config.ports[1].type == SAEC_Config_Ports_Type_Joy1) {
if (
(SAEV_config.ports[1].type == SAEC_Config_Ports_Type_Joy) ||
(SAEV_config.ports[1].type == SAEC_Config_Ports_Type_JoyEmu)
) {
if (!SAER.input.joystick[1].button[0]) tmp |= 0x80;
if (dra & 0x80) tmp = (tmp & ~0x80) | (pra & 0x80);
} else tmp |= 0x80;
Expand Down
9 changes: 5 additions & 4 deletions sae/config.js
Expand Up @@ -372,8 +372,8 @@ const SAEC_Config_Audio_Interpol_Crux = 3;

const SAEC_Config_Ports_Type_None = 0;
const SAEC_Config_Ports_Type_Mouse = 1;
const SAEC_Config_Ports_Type_Joy0 = 2;
const SAEC_Config_Ports_Type_Joy1 = 3;
const SAEC_Config_Ports_Type_Joy = 2;
const SAEC_Config_Ports_Type_JoyEmu = 3;

const SAEC_Config_Ports_Move_None = 0;
const SAEC_Config_Ports_Move_Arrows = 1;
Expand Down Expand Up @@ -675,7 +675,7 @@ function SAEO_Config() {
move: SAEC_Config_Ports_Move_WASD,
fire: [49,50]
}, {
type: SAEC_Config_Ports_Type_Joy1,
type: SAEC_Config_Ports_Type_JoyEmu,
move: SAEC_Config_Ports_Move_Arrows,
fire: [16,17]
}];
Expand Down Expand Up @@ -1161,7 +1161,8 @@ function SAEO_Configuration() {
p.ports[0].type = SAEC_Config_Ports_Type_Mouse;
p.ports[0].move = SAEC_Config_Ports_Move_WASD;
p.ports[0].fire = [49,50];
p.ports[1].type = SAEC_Config_Ports_Type_Joy1;
p.ports[1].type = SAEC_Config_Ports_Type_JoyEmu;
p.ports[1].device = 0;
p.ports[1].move = SAEC_Config_Ports_Move_Arrows;
p.ports[1].fire = [16,17];
/*memset (&p.jports[0], 0, sizeof (struct jport));
Expand Down