1
0
mirror of https://github.com/Ylianst/MeshCommander synced 2025-12-05 21:53:19 +00:00
Files
MeshCommander/amt-lms-0.0.1.js
Ylian Saint-Hilaire 3deafe34ef first commit
2020-03-09 11:11:06 -07:00

104 lines
3.6 KiB
JavaScript

/**
* @description Intel AMT LMS control module - using websocket
* @author Ylian Saint-Hilaire
* @version v0.0.1
*/
// Construct a LMS control object
var CreateLmsControl = function () {
var obj = {};
var socket = null;
obj.State = 0;
obj.onStateChanged = null;
obj.onData = null;
// Private method
obj.Start = function () {
socket = new WebSocket(window.location.protocol.replace("http", "ws") + "//" + window.location.host + "/lms.ashx");
socket.onopen = _OnSocketConnected;
socket.onmessage = _OnMessage;
socket.onclose = obj.Stop;
_StateChange(1);
}
function _OnSocketConnected() {
_StateChange(2);
}
// Setup the file reader
var fileReader = new FileReader();
var fileReaderInuse = false, fileReaderAcc = [];
if (fileReader.readAsBinaryString) {
// Chrome & Firefox (Draft)
fileReader.onload = function (e) { _OnSocketData(e.target.result); if (fileReaderAcc.length == 0) { fileReaderInuse = false; } else { fileReader.readAsBinaryString(new Blob([fileReaderAcc.shift()])); } }
} else if (fileReader.readAsArrayBuffer) {
// Chrome & Firefox (Spec)
fileReader.onloadend = function (e) { _OnSocketData(e.target.result); if (fileReaderAcc.length == 0) { fileReaderInuse = false; } else { fileReader.readAsArrayBuffer(fileReaderAcc.shift()); } }
}
function _OnMessage(e) {
if (typeof e.data == 'object') {
if (fileReaderInuse == true) { fileReaderAcc.push(e.data); return; }
if (fileReader.readAsBinaryString) {
// Chrome & Firefox (Draft)
fileReaderInuse = true;
fileReader.readAsBinaryString(new Blob([e.data]));
} else if (fileReader.readAsArrayBuffer) {
// Chrome & Firefox (Spec)
fileReaderInuse = true;
fileReader.readAsArrayBuffer(e.data);
} else {
// IE10, readAsBinaryString does not exist, use an alternative.
var binary = "", bytes = new Uint8Array(e.data), length = bytes.byteLength;
for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); }
_OnSocketData(binary);
}
} else {
_OnSocketData(e.data);
}
};
function _OnSocketData(data) {
if (!data) return;
if (typeof data === 'object') {
// This is an ArrayBuffer, convert it to a string array (used in IE)
var binary = "";
var bytes = new Uint8Array(data);
var length = bytes.byteLength;
for (var i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]); }
data = binary;
}
else if (typeof data !== 'string') { return; }
// Send the data up
if (obj.onData != null) obj.onData(obj, data);
}
function _Send(x) {
if (socket != null && socket.readyState == WebSocket.OPEN) {
var b = new Uint8Array(x.length);
for (var i = 0; i < x.length; ++i) { b[i] = x.charCodeAt(i); }
socket.send(b.buffer);
}
}
obj.SendCmd = function (cmdid, data) {
if (socket == null || obj.State != 2) return;
if (!data || data == null) data = "";
_Send(ShortToStrX(cmdid) + data);
}
function _StateChange(newstate) {
if (obj.State == newstate) return;
obj.State = newstate;
if (obj.onStateChanged != null) obj.onStateChanged(obj, obj.State);
}
obj.Stop = function () {
_StateChange(0);
if (socket != null) { socket.close(); socket = null; }
}
return obj;
}