From 4e9695f752ac2e61cf72829643f653889b7d2121 Mon Sep 17 00:00:00 2001 From: Ylian Saint-Hilaire Date: Tue, 21 Dec 2021 12:38:10 -0800 Subject: [PATCH] Tested and fixed KVM improvements in AMT 16. --- amt-desktop-0.0.2.js | 45 +++++++++++++++++--------- index.html | 77 +++++++++++++++++++++++--------------------- 2 files changed, 70 insertions(+), 52 deletions(-) diff --git a/amt-desktop-0.0.2.js b/amt-desktop-0.0.2.js index da75197..b31ad7e 100644 --- a/amt-desktop-0.0.2.js +++ b/amt-desktop-0.0.2.js @@ -177,8 +177,9 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(7) + ShortToStr(7) + ShortToStr(3) + String.fromCharCode(5, 2, 0, 0, 0, 0)); // Setup 8 bit color RGB332 } else { // Gray scale modes - if (obj.bpp == 2) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(255) + ShortToStr(0) + ShortToStr(0) + String.fromCharCode(0, 0, 0, 0, 0, 0)); // Setup 8 bit black and white RGB800 - if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(15) + ShortToStr(0) + ShortToStr(0) + String.fromCharCode(0, 0, 0, 0, 0, 0)); // Setup 4 bit black and white RGB400 + if (obj.bpp == 2) { obj.bpp = 1; } + if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(255) + ShortToStr(0) + ShortToStr(0) + String.fromCharCode(0, 0, 0, 0, 0, 0)); // Setup 8 bit black and white RGB800 + //if (obj.bpp == 1) obj.send(String.fromCharCode(0, 0, 0, 0, 8, 8, 0, 1) + ShortToStr(15) + ShortToStr(0) + ShortToStr(0) + String.fromCharCode(0, 0, 0, 0, 0, 0)); // Setup 4 bit black and white RGB400 } obj.state = 4; @@ -190,8 +191,8 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { // ###END###{DesktopFocus} // ###BEGIN###{DesktopInband} if (obj.kvmExtChanged != null) { - obj.sendKvmExtCmd(2, (obj.decimation === true) ? 1 : 0); // Set Decimation State - obj.sendKvmExtCmd(4, (obj.useZLib === true) ? 1 : 0); // Set ZLib state + obj.sendKvmExtCmd(2, (obj.decimation === true) ? 3 : 2); // Set Decimation State (1 = Disable, 2 = Auto, 3 = Always) + obj.sendKvmExtCmd(4, (obj.useZLib === true) ? 1 : 0); // Set ZLib state (0 = Disabled, 1 = Enabled) } // ###END###{DesktopInband} _SendRefresh(); @@ -258,7 +259,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { obj.send(String.fromCharCode(3, 0, 0, 0, 0, 0) + ShortToStr(obj.width) + ShortToStr(obj.height)); // FramebufferUpdateRequest cmdsize = 12; if (obj.onScreenSizeChange != null) { obj.onScreenSizeChange(obj, obj.ScreenWidth, obj.ScreenHeight); } - //console.log('New desktop width: ' + obj.width + ', height: ' + obj.height); + //console.log('Desktop width: ' + obj.width + ', height: ' + obj.height); } else if (encoding == 0) { // RAW encoding var ptr = 12, cs = 12 + (s * obj.bpp); @@ -324,8 +325,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { } else if (subencoding == 1) { // Solid color tile - v = data[ptr++] + ((obj.bpp == 2) ? (data[ptr++] << 8) : 0); - obj.canvas.fillStyle = 'rgb(' + ((obj.bpp == 1) ? ((v & 224) + ',' + ((v & 28) << 3) + ',' + _fixColor((v & 3) << 6)) : (((v >> 8) & 248) + ',' + ((v >> 3) & 252) + ',' + ((v & 31) << 3))) + ')'; + if (obj.graymode) { + v = data[ptr++]; + obj.canvas.fillStyle = 'rgb(' + v + ',' + v + ',' + v + ')'; + } else { + v = data[ptr++] + ((obj.bpp == 2) ? (data[ptr++] << 8) : 0); + obj.canvas.fillStyle = 'rgb(' + ((obj.bpp == 1) ? ((v & 224) + ',' + ((v & 28) << 3) + ',' + _fixColor((v & 3) << 6)) : (((v >> 8) & 248) + ',' + ((v >> 3) & 252) + ',' + ((v & 31) << 3))) + ')'; + } // ###BEGIN###{DesktopRotation} var xx = _rotX(x, y); @@ -463,9 +469,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { } // ###END###{DesktopRotation} - obj.spare.data[pp] = v & 224; - obj.spare.data[pp + 1] = (v & 28) << 3; - obj.spare.data[pp + 2] = _fixColor((v & 3) << 6); + if (obj.graymode) { + obj.spare.data[pp] = obj.spare.data[pp + 1] = obj.spare.data[pp + 2] = v; + } else { + obj.spare.data[pp] = v & 224; + obj.spare.data[pp + 1] = (v & 28) << 3; + obj.spare.data[pp + 2] = _fixColor((v & 3) << 6); + } } // Set 16bit color RGB565 @@ -487,8 +497,13 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { // Set a run of 8bit color RGB332 function _setPixel8run(v, p, run) { - var pp = (p << 2), r = (v & 224), g = ((v & 28) << 3), b = (_fixColor((v & 3) << 6)); - while (--run >= 0) { obj.spare.data[pp] = r; obj.spare.data[pp + 1] = g; obj.spare.data[pp + 2] = b; pp += 4; } + if (obj.graymode) { + var pp = (p << 2); + while (--run >= 0) { obj.spare.data[pp] = obj.spare.data[pp + 1] = obj.spare.data[pp + 2] = v; pp += 4; } + } else { + var pp = (p << 2), r = (v & 224), g = ((v & 28) << 3), b = (_fixColor((v & 3) << 6)); + while (--run >= 0) { obj.spare.data[pp] = r; obj.spare.data[pp + 1] = g; obj.spare.data[pp + 2] = b; pp += 4; } + } } // Set a run of 16bit color RGB565 @@ -778,14 +793,14 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { if (obj.onKvmData != null) { var d = arrToStr(new Uint8Array(acc.buffer.slice(8, len))); if ((d.length >= 16) && (d.substring(0, 15) == '\0KvmDataChannel')) { - if (obj.kvmDataSupported == false) { obj.kvmDataSupported = true; console.log('KVM Data Channel Supported.'); } + if (obj.kvmDataSupported == false) { obj.kvmDataSupported = true; /*console.log('KVM Data Channel Supported.');*/ } if (((obj.onKvmDataAck == -1) && (d.length == 16)) || (d.charCodeAt(15) != 0)) { obj.onKvmDataAck = true; } if (urlvars && urlvars['kvmdatatrace']) { console.log('KVM-DataChannel-Recv(' + (d.length - 16) + '): ' + d.substring(16)); } if (d.length >= 16) { obj.onKvmData(d.substring(16)); } // Event the data and ack if ((obj.onKvmDataAck == true) && (obj.onKvmDataPending.length > 0)) { obj.sendKvmData(obj.onKvmDataPending.shift()); } // Send pending data } else if ((d.length >= 13) && (d.substring(0, 11) == '\0KvmExtCmd\0')) { var cmd = d.charCodeAt(11), val = d.charCodeAt(12); - console.log('Received KvmExtCmd', cmd, val); + //console.log('Received KvmExtCmd', cmd, val); if (cmd == 1) { obj.kvmExt.decimation = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(1, val); } } if (cmd == 2) { obj.sendKvmExtCmd(1); } if (cmd == 3) { obj.kvmExt.compression = val; if (obj.kvmExtChanged != null) { obj.kvmExtChanged(3, val); } } @@ -801,7 +816,7 @@ var CreateAmtRemoteDesktop = function (divid, scrolldiv) { // ###BEGIN###{DesktopInband} obj.sendKvmExtCmd = function (cmd, val) { - console.log('Sending KvmExtCmd', cmd, val); + //console.log('Sending KvmExtCmd', cmd, val); var x = '\0KvmExtCmd\0' + String.fromCharCode(cmd) + (val != null ? String.fromCharCode(val) : ''); obj.send(String.fromCharCode(6, 0, 0, 0) + IntToStr(x.length) + x); } diff --git a/index.html b/index.html index 5e3061c..98187a3 100644 --- a/index.html +++ b/index.html @@ -1365,21 +1365,15 @@
Image Encoding
@@ -1387,8 +1381,8 @@

-
+



@@ -1625,7 +1619,7 @@



-

+

Boot Settings
@@ -5344,13 +5338,14 @@ if ((responses['CIM_KVMRedirectionSAP'] == undefined) || (responses['CIM_KVMRedirectionSAP'].status == 400)) { responses['CIM_KVMRedirectionSAP'] = null; } if ((responses['IPS_OptInService'] == undefined) || (responses['IPS_OptInService'].status == 400)) { responses['IPS_OptInService'] = null; } if ((responses['AMT_RedirectionService'] != undefined) && (responses['AMT_RedirectionService'].status == 200)) { QV('go13', true); } // Show the terminal - + // Reset the status after possible KVM removal status = 0; for (var i in responses) { if ((responses[i] != null) && (responses[i].status > status)) { status = responses[i].status; } } if ((status != 400) && errcheck(status, stack)) return; amtsysstate = responses; + applyDesktopSettings(); updateSystemStatus(); } @@ -8362,11 +8357,15 @@ // Encoding Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib, 16 = Decimation desktop.m.useRLE = ((desktopsettings.encflags & 1) != 0); desktop.m.bpp = (desktopsettings.encflags & 2) ? 2 : 1; - // ###BEGIN###{DesktopInband} - desktop.m.graymode = ((desktopsettings.encflags & 4) != 0); - desktop.m.useZLib = ((desktopsettings.encflags & 8) != 0); - desktop.m.decimation = desktopsettings.decimation; - // ###END###{DesktopInband} + if ((amtversion > 15) && (amtsysstate != null) && (amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) { + desktop.m.graymode = amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported'] && ((desktopsettings.encflags & 4) != 0); + desktop.m.useZLib = amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported'] && ((desktopsettings.encflags & 8) != 0); + desktop.m.decimation = amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] && desktopsettings.decimation; + } else { + desktop.m.graymode = false; + desktop.m.useZLib = false; + desktop.m.decimation = false; + } desktop.m.showmouse = desktopsettings.showmouse; desktop.m.onScreenSizeChange = center; // ###BEGIN###{ComputerSelector} @@ -8593,8 +8592,8 @@ x = ", Soft-KVM"; } else { if (desktop.m && desktop.m.kvmExt) { - if (desktop.m.kvmExt.decimation == 2) { x += ", Gray" } - if (desktop.m.kvmExt.compression == 1) { x += ", ZLib" } + //if (desktop.m.kvmExt.decimation == 2) { x += ", Downscaled" } + if (desktop.m.kvmExt.compression == 1) { x += ", Compressed" } } } } @@ -8631,21 +8630,13 @@ if (desktopsettings.showfocus == false) { desktop.m.focusmode = 0; idx_deskFocusBtn.value = "All Focus"; } // ###END###{DesktopFocus} desktop.m.frameRateDelay = (desktopsettings.limitFrameRate == true)?200:0; - if (desktop.State != 0) { desktop.disconnectCode = 0; desktop.Stop(); setTimeout(connectDesktop, 50); } + if (desktop.State != 0) { desktop.disconnectCode = 0; desktop.Stop(); setTimeout(connectDesktop, 800); } } function applyDesktopSettings() { - // ###BEGIN###{!DesktopInband} - desktopsettings.encflags = desktopsettings.encflags & 3; // Remove gray & zlib flags (4 and 8), keep 1 & 2 - // ###END###{!DesktopInband} - // ###BEGIN###{DesktopInband} - if (amtversion < 15) { desktopsettings.encflags = desktopsettings.encflags & 3; } // Remove gray & zlib flags (4 and 8), keep 1 & 2 - // ###END###{DesktopInband} - idx_d7desktopmode.value = desktopsettings.encflags; // ###BEGIN###{DesktopFocus} d7showfocus.checked = desktopsettings.showfocus; d7decimation.checked = desktopsettings.decimation; - QV('d7decimationspan', (amtversion > 15) || (urlvars['kvmext'] != null)) // ###END###{DesktopFocus} d7showcursor.checked = desktopsettings.showmouse; d7showcad.checked = desktopsettings.showcad; @@ -8655,13 +8646,25 @@ if (desktopsettings.quality) { d7bitmapquality.value = desktopsettings.quality; } if (desktopsettings.scaling) { d7bitmapscaling.value = desktopsettings.scaling; } QV('d7softkvmsettings', amtversion >= 12); - QV('d7exm1', (amtversion > 15) || urlvars['kvmext']); - QV('d7exm2', (amtversion > 15) || urlvars['kvmext']); - QV('d7exm3', (amtversion > 15) || urlvars['kvmext']); - QV('d7exm4', (amtversion > 15) || urlvars['kvmext']); - QV('d7exm5', (amtversion > 15) || urlvars['kvmext']); - QV('d7exm6', (amtversion > 15) || urlvars['kvmext']); // ###END###{DesktopInband} + var encflags = desktopsettings.encflags; // Flags: 1 = RLE, 2 = 16bit, 4 = Gray, 8 = ZLib + if ((amtversion > 15) && (amtsysstate != null) && (amtsysstate['IPS_KVMRedirectionSettingData'] != null) && (amtsysstate['IPS_KVMRedirectionSettingData'].response)) { + if (!amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']) { encflags = encflags & 11; } // Remove grayscale + if (!amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']) { encflags = encflags & 7; } // Remove zlib + QV('d7exm1', amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported']); + QV('d7exm2', amtsysstate['IPS_KVMRedirectionSettingData'].response['GrayscalePixelFormatSupported'] && amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']); + QV('d7exm3', amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']); + QV('d7exm4', amtsysstate['IPS_KVMRedirectionSettingData'].response['ZlibControlSupported']); + QV('d7decimationspan', amtsysstate['IPS_KVMRedirectionSettingData'].response['InitialDecimationModeForLowRes'] > 0); + } else { + encflags = encflags & 3; // Remove gray & zlib flags (4 and 8), keep 1 & 2 + QV('d7exm1', false); + QV('d7exm2', false); + QV('d7exm3', false); + QV('d7exm4', false); + QV('d7decimationspan', false) + } + idx_d7desktopmode.value = encflags; // ###BEGIN###{DesktopFocus} QV('idx_deskFocusBtn', desktopsettings.showfocus); // ###END###{DesktopFocus}