// Requests
var timer_uptime;
var timer_peek_all;
// Peek all strings
function read_ids() {
read_id(0x000, 0);
read_id(0x080, 1);
read_id(0x0C0, 2);
read_id(0x100, 3);
read_id(0x110, 4);
}
// Peek string & display result
function read_id(offset, reg) {
var url = "/cgi-bin/peekstring?0x40000000&4096&" + offset + "&128";
if (window.XMLHttpRequest) {
var ajaxReq = new XMLHttpRequest();
ajaxReq.onreadystatechange = function() {
if (ajaxReq.readyState == 4 && ajaxReq.status == 200) {
var respText = ajaxReq.responseText;
if (respText.substr(0,6) == "Error:") {
alert("Error!");
} else {
document.getElementById("id_" + reg).innerHTML = respText;
}
}
}
ajaxReq.open("POST", url, true);
ajaxReq.send(null);
}
}
// Get uptime
function get_uptime(reg) {
var url = "cgi-bin/uptime.cgi";
if (window.XMLHttpRequest) {
var ajaxReq = new XMLHttpRequest();
ajaxReq.onreadystatechange = function() {
if (ajaxReq.readyState == 4 && ajaxReq.status == 200) {
var respText = ajaxReq.responseText;
txtObj = document.getElementById("uptime_text");
if (txtObj) {
txtObj.innerHTML = respText;
}
}
}
ajaxReq.open("POST", url, true);
ajaxReq.send(null);
}
}
// Update uptime timer
function uptime() {
clearInterval(timer_uptime);
var uptime = document.getElementById("uptime");
var interval = uptime.value;
if (interval > 0) {
timer_uptime = setInterval("get_uptime()", 1000 * interval);
}
}
// Update peek_all timer
function timer() {
clearInterval(timer_peek_all);
var timer = document.getElementById("timer");
interval = timer.value;
if (interval > 0) {
timer_peek_all = setInterval("peek_all()", 1000 * interval);
}
}
// Update number format
function format() {
var table = document.getElementById("registers");
var rows = table.rows.length;
var peek;
var poke;
for (var index = 0; index < rows; index++) {
peek = document.getElementById("peek_" + index);
if (peek) {
peek.value = fmtUnsignedLong(parseInt(peek.value));
}
poke = document.getElementById("poke_" + index);
if (poke) {
poke.value = fmtUnsignedLong(parseInt(poke.value));
}
}
}
// Convert unsigned long to dec/hex string
function fmtUnsignedLong(value) {
var format = document.getElementById("format");
var hexStr;
if (format.value == 0) {
hexStr = value.toString(16).toUpperCase();
hexStr = "0x" + "00000000".substr(0, 8 - hexStr.length) + hexStr;
} else {
hexStr = value.toString(10);
}
return hexStr;
}
// Copy peek to poke
function copy(reg) {
var peek = document.getElementById("peek_" + reg);
if (peek) {
var poke = document.getElementById("poke_" + reg);
if (poke) {
poke.value = peek.value;
}
}
}
// Copy all peek to poke
function copy_all() {
var table = document.getElementById("registers");
var rows = table.rows.length - 1;
for (var index = 0; index < rows; index++) {
copy(index);
}
}
// Peek all addresses
function peek_all() {
var table = document.getElementById("registers");
var rows = table.rows.length - 1;
for (var index = 0; index < rows; index++) {
peek(index);
}
}
// Poke all addresses
function poke_all() {
var table = document.getElementById("registers");
var rows = table.rows.length - 1;
for (var index = 0; index < rows; index++) {
poke(index);
}
}
// Add row to table
function add_register(reg) {
var table = document.getElementById("registers");
var next = table.rows.length - 1;
var row = table.insertRow(-1);
var newcell;
var addr = 0x41200000;
if (next > 0) {
addr = parseInt(document.getElementById("addr_" + (next - 1)).value) + 4;
}
newcell = row.insertCell(0);
newcell.innerHTML = '';
newcell = row.insertCell(1);
newcell.innerHTML = '';
newcell = row.insertCell(2);
newcell.innerHTML = '';
newcell = row.insertCell(3);
newcell.innerHTML = '-';
newcell = row.insertCell(4);
newcell.innerHTML = '';
newcell = row.insertCell(5);
newcell.innerHTML = '';
newcell = row.insertCell(6);
newcell.innerHTML = '';
newcell = row.insertCell(7);
newcell.innerHTML = '-';
newcell = row.insertCell(8);
newcell.innerHTML = '';
}
// Remove all rows from table
function remove_all() {
var table = document.getElementById("registers");
var rows = table.rows.length - 1;
for (var index = 0; index < rows; index++) {
table.deleteRow(-1);
}
}
// Remove row from table
function rem_register(reg) {
var table = document.getElementById("registers");
if (table.rows.length > 1) {
table.deleteRow(-1);
}
}
// Poke address & display result
function poke(reg) {
var url = "/cgi-bin/poke?" + document.getElementById("addr_" + reg).value + "&" + document.getElementById("poke_" + reg).value;
if (window.XMLHttpRequest) {
var ajaxReq = new XMLHttpRequest();
ajaxReq.onreadystatechange = function() {
if (ajaxReq.readyState == 4 && ajaxReq.status == 200) {
var respText = ajaxReq.responseText;
if (respText.substr(0,6) == "Error:") {
document.getElementById("spoke_" + reg).innerHTML = "Failed";
} else {
document.getElementById("spoke_" + reg).innerHTML = "Success";
}
}
}
ajaxReq.open("POST", url, true);
ajaxReq.send(null);
}
}
// Peek address & display result
function peek(reg) {
var url = "/cgi-bin/peek?" + document.getElementById("addr_" + reg).value;
if (window.XMLHttpRequest) {
var ajaxReq = new XMLHttpRequest();
ajaxReq.onreadystatechange = function() {
if (ajaxReq.readyState == 4 && ajaxReq.status == 200) {
var respText = ajaxReq.responseText;
if (respText.substr(0,6) == "Error:") {
document.getElementById("speek_" + reg).innerHTML = "Failed";
} else {
document.getElementById("speek_" + reg).innerHTML = "Success";
document.getElementById("peek_" + reg).value = fmtUnsignedLong(parseInt(respText));
}
}
}
ajaxReq.open("POST", url, true);
ajaxReq.send(null);
}
}
// Note: browser file access is made difficult for security reasons - there maybe a better way of doing file read & write.
var config_file = null;
// Create virtual configuration file from address table for user to download
function create_config() {
var text = "";
var table = document.getElementById("registers");
var rows = table.rows.length - 1;
for (var index = 0; index < rows; index++) {
var addr = document.getElementById("addr_" + index).value;
var poke = document.getElementById("poke_" + index).value;
var name = document.getElementById("name_" + index).value;
text += addr + "|" + poke + "|" + name + "\n";
}
const data = new Blob([text], {type: 'text/plain'});
if (config_file !== null) {
URL.revokeObjectURL(config_file);
}
config_file = URL.createObjectURL(data);
var link = document.getElementById('download');
link.href = config_file;
link.style.display = 'inline';
}
// Read configuration file and update address table
function load_config(input) {
var file = input.target.files[0];
if (file) {
var reader = new FileReader();
reader.onload = function(input) {
var contents = input.target.result;
const lines = contents.split(/\r\n|\n/);
remove_all();
lines.forEach((line) => {
if (line.length > 0) {
var table = document.getElementById("registers");
var next = table.rows.length - 1;
add_register();
const values = line.split("|");
document.getElementById("addr_" + next).value = values[0];
document.getElementById("poke_" + next).value = values[1];
document.getElementById("name_" + next).value = values[2];
}
});
};
reader.readAsText(file);
}
}
document.getElementById('load_config').addEventListener('change', load_config, false);