为 [FPGA Online](https://fpgaol.ustc.edu.cn/) 提供的更多功能
当前为
// ==UserScript==
// @name FPGA-Plus
// @namespace http://tampermonkey.net/
// @version 0.4.1
// @description 为 [FPGA Online](https://fpgaol.ustc.edu.cn/) 提供的更多功能
// @author PRO
// @license gpl-3.0
// @match *://fpgaol.ustc.edu.cn/*
// @match http://202.38.79.134:*/*
// @grant none
// @icon https://fpgaol.ustc.edu.cn/favicon.ico
// ==/UserScript==
(function() {
'use strict';
if (window.location.hostname == 'fpgaol.ustc.edu.cn') { // Main page
let navbar = document.querySelector(".navbar-nav");
if (!navbar) return;
let last = navbar.querySelector("form");
if (!last) return;
let hint = document.createElement("li");
hint.classList.add("nav-item");
hint.innerHTML = '<a class="nav-link" title="Click to copy" href="javascript:navigator.clipboard.writeText(\'xc7a100tcsg324-1\');">xc7a100tcsg324-1</a>';
navbar.insertBefore(hint, last);
return;
} // Dev page
// Visual improvements
let rsp = document.getElementById("responsetext");
let upload = document.getElementById("upload-button");
upload.addEventListener("click", (e)=>{
rsp.textContent = "Waiting...";
});
// Default upload
let default_input = document.getElementById("bitstream");
let customed = document.getElementById("file-select");
default_input.style.fontSize = "1.3em";
default_input.attributes.removeNamedItem("hidden");
customed.parentNode.replaceChild(default_input, customed);
// Led value
// Pre-process
let val = 0;
let panel = document.querySelector(".col-5.colmodule");
panel.insertAdjacentHTML('afterbegin', '<div class="container"><span id="info" style="padding: inherit;">Bin: 0b00000000; Hex: 0x00; Dec (unsigned): 0</span></div>');
// Functions
function checkbox_patch(checkbox) {
// Check out https://github.com/PRO-2684/gadgets/blob/main/checkbox_patch/ if you're interested in this part
const { get, set } = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked');
Object.defineProperty(checkbox, 'checked', {
get() {
return get.call(this);
},
set(newVal) {
let ret = set.call(this, newVal);
this.dispatchEvent(new Event("change"));
return ret;
}
});
}
function get_bit(n) {
return (val >> n) & 1;
}
function set_bit(n, b) {
if (b) {
val |= (1 << n);
} else {
val &= ~(1 << n);
}
}
function update() {
let bin_str = '0b' + val.toString(2).padStart(8, '0');
let hex_str = '0x' + val.toString(16).padStart(2, '0');
let dec_str = val.toString();
let res = `Bin: ${bin_str}; Hex: ${hex_str}; Dec (unsigned): ${dec_str}`;
info.textContent = res;
}
// Setup listeners & init
for (let i = 0; i <= 7; i++) {
let led = document.getElementById(`led${i}`);
set_bit(i, led.checked);
checkbox_patch(led);
led.addEventListener("change", (e) => {
set_bit(i, led.checked);
update();
});
}
update();
})();