Added frame rate control for remote desktop

Ylian Saint-Hilaire committed Apr 6, 2018 at 15:56 UTC d05f086a0e22d2c79cef6c04589dbaa3d291e96c
5 files changed +31 -11
agents/meshagent_pi
Binary files a/agents/meshagent_pi and b/agents/meshagent_pi differ
agents/meshagent_x86
Binary files a/agents/meshagent_x86 and b/agents/meshagent_x86 differ
agents/meshagent_x86-64
Binary files a/agents/meshagent_x86-64 and b/agents/meshagent_x86-64 differ
package.json
+1 -1
@@ -1,6 +1,6 @@
1 {
2 "name": "meshcentral",
3 - "version": "0.1.5-y",
3 + "version": "0.1.6-a",
4 "keywords": [
5 "Remote Management",
6 "Intel AMT",
views/default.handlebars
+30 -10
@@ -604,6 +604,15 @@
604 </select>
605 <div style="height:20px">Scaling</div>
606 </div>
607 + <div style="margin:3px 0 3px 0">
608 + <select id="d7framelimiter" style="float:right;width:200px;height:20px" dir="rtl">
609 + <option selected=selected value=50>Fast</option>
610 + <option value=100>Medium</option>
611 + <option value=400>Slow</option>
612 + <option value=1000>Very slow</option>
613 + </select>
614 + <div style="height:20px">Frame rate</div>
615 + </div>
616 </div>
617 <div id="d7amtkvm">
618 <h4 style="width:100%;border-bottom:1px solid gray">Intel&reg; AMT Hardware KVM</h4>
@@ -659,8 +668,8 @@
668 var wssessions = null;
669 var nodeShortIdent = 0;
670 var desktop;
662 - var desktopsettings = { encoding: 2, showfocus: false, showmouse: true, showcad: true, quality: 40, scaling: 1024 };
663 - var multidesktopsettings = { quality: 30, scaling: 128 };
671 + var desktopsettings = { encoding: 2, showfocus: false, showmouse: true, showcad: true, quality: 40, scaling: 1024, framerate: 50 };
672 + var multidesktopsettings = { quality: 20, scaling: 128, framerate: 1000 };
673 var terminal;
674 var files;
675 var debugLevel = {{{debuglevel}}};
@@ -1222,10 +1231,10 @@
1231 case 'wssessioncount': {
1232 // Update the active web socket session count for a user
1233 if (wssessions != null) {
1225 - if (message.event.count == 0 && wssessions['user/{{{domain}}}/' + message.event.username]) {
1226 - delete wssessions['user/{{{domain}}}/' + message.event.username];
1234 + if (message.event.count == 0 && wssessions['user/{{{domain}}}/' + message.event.username.toLowerCase()]) {
1235 + delete wssessions['user/{{{domain}}}/' + message.event.username.toLowerCase()];
1236 } else {
1228 - wssessions['user/{{{domain}}}/' + message.event.username] = message.event.count;
1237 + wssessions['user/{{{domain}}}/' + message.event.username.toLowerCase()] = message.event.count;
1238 }
1239 updateUsers();
1240 }
@@ -1238,7 +1247,7 @@
1247 }
1248 case 'login': {
1249 // Update the last login time
1241 - if (users != null && users['user/{{{domain}}}/' + message.event.username]) { users['user/{{{domain}}}/' + message.event.username].login = message.event.time; }
1250 + if (users != null && users['user/{{{domain}}}/' + message.event.username.toLowerCase()]) { users['user/{{{domain}}}/' + message.event.username.toLowerCase()].login = message.event.time; }
1251 break;
1252 }
1253 case 'scanamtdevice': {
@@ -1537,7 +1546,7 @@
1546 c.removeAttribute('onmousemove');
1547 Q('xkvmid_' + shortid).appendChild(c);
1548 QH('skvmid_' + shortid, ['Disconnected', 'Connecting...', 'Setup...', '', ''][((desktop.m.State == null)?desktop.m.state:desktop.m.State)]);
1540 - if (desktop.m.SendCompressionLevel) { desktop.m.SendCompressionLevel(1, multidesktopsettings.quality, multidesktopsettings.scaling); }
1549 + if (desktop.m.SendCompressionLevel) { desktop.m.SendCompressionLevel(1, multidesktopsettings.quality, multidesktopsettings.scaling, multidesktopsettings.framerate); }
1550 desktop.shortid = shortid;
1551 desktop.onStateChanged = onMultiDesktopStateChange;
1552 multiDesktop[id] = desktop;
@@ -1590,15 +1599,17 @@
1599 QV('d7meshkvm', true);
1600 d7bitmapquality.value = multidesktopsettings.quality;
1601 d7bitmapscaling.value = multidesktopsettings.scaling;
1602 + if (multidesktopsettings.framerate) { d7framelimiter.value = multidesktopsettings.framerate; } else { d7framelimiter.value = 1000; }
1603 setDialogMode(7, "Remote Desktop Settings", 3, showMultiDesktopSettingsChanged);
1604 }
1605
1606 function showMultiDesktopSettingsChanged() {
1607 multidesktopsettings.quality = d7bitmapquality.value;
1608 multidesktopsettings.scaling = d7bitmapscaling.value;
1609 + multidesktopsettings.framerate = d7framelimiter.value;
1610 localStorage.setItem('multidesktopsettings', JSON.stringify(multidesktopsettings));
1611 // Make changes to all current connections
1601 - for (var i in multiDesktop) { multiDesktop[i].m.SendCompressionLevel(1,multidesktopsettings.quality,multidesktopsettings.scaling); }
1612 + for (var i in multiDesktop) { multiDesktop[i].m.SendCompressionLevel(1, multidesktopsettings.quality, multidesktopsettings.scaling, multidesktopsettings.framerate); }
1613 }
1614
1615 function connectMultiDesktop(node, contype) {
@@ -1628,6 +1639,7 @@
1639 desk.onStateChanged = onMultiDesktopStateChange;
1640 desk.m.CompressionLevel = multidesktopsettings.quality;
1641 desk.m.ScalingLevel = multidesktopsettings.scaling;
1642 + desk.m.FrameRateTimer = multidesktopsettings.framerate;
1643 //desk.m.onDisplayinfo = deskDisplayInfo;
1644 //desk.m.onScreenSizeChange = deskAdjust;
1645 desk.Start(nodeid);
@@ -2214,6 +2226,10 @@
2226 if (existingfeature) { xxmap.markersSource.addFeature(existingfeature); } // Add that existing feature
2227 else { // Add new feature for this node
2228 if (!lat && !lon) { var loc = map_parseNodeLoc(node); lat = loc[0]; lon = loc[1]; }
2229 +
2230 + // Fix the longiture and send an event to patch the db to correct coordinate format. It will cause second unnecessary updateFeature on this node to the map.
2231 + if (lon > 180) { lon = 180 - lon; meshserver.send({ action: 'changedevice', nodeid: node._id, userloc: [ lat, lon ] }); }
2232 +
2233 if ((lat < 90) && (lat > -90) && (lon < 180) && (lon > -180)) { // Check valid lat/lon
2234 var feature = new ol.Feature({ geometry: new ol.geom.Point(ol.proj.transform([lon, lat], 'EPSG:4326','EPSG:3857')), name: node.name, status: node.conn, lat: lat, lon: lon });
2235 feature.setId(node._id); // Set id for the device as nodeid
@@ -2274,6 +2290,7 @@
2290 removeInteraction(featid);
2291 var coord = ft.getGeometry().getCoordinates();
2292 var v = ol.proj.transform(coord, 'EPSG:3857', 'EPSG:4326');
2293 + if (v[0] > 180) { v[0] = 180 - v[0]; }
2294 var vx = [ v[1], v[0] ]; // Flip the coordinates around, lat/long
2295 meshserver.send({ action: 'changedevice', nodeid: featid, userloc: vx }); // Send them to server to save changes
2296 }
@@ -3130,7 +3147,7 @@
3147 c.removeAttribute('onclick');
3148 Q('DeskParent').appendChild(c);
3149 desktop = xdesk;
3133 - if (desktop.m.SendCompressionLevel) { desktop.m.SendCompressionLevel(1, desktopsettings.quality, desktopsettings.scaling); }
3150 + if (desktop.m.SendCompressionLevel) { desktop.m.SendCompressionLevel(1, desktopsettings.quality, desktopsettings.scaling, desktopsettings.framerate); }
3151 desktop.onStateChanged = onDesktopStateChange;
3152 desktopNode = currentNode;
3153 onDesktopStateChange(desktop, desktop.State);
@@ -3197,6 +3214,7 @@
3214 desktop.onStateChanged = onDesktopStateChange;
3215 desktop.m.CompressionLevel = desktopsettings.quality; // Number from 1 to 100. 50 or less is best.
3216 desktop.m.ScalingLevel = desktopsettings.scaling;
3217 + desktop.m.FrameRateTimer = desktopsettings.framerate;
3218 desktop.m.onDisplayinfo = deskDisplayInfo;
3219 desktop.m.onScreenSizeChange = deskAdjust;
3220 desktop.Start(desktopNode._id);
@@ -3251,11 +3269,12 @@
3269 desktopsettings.showmouse = d7showcursor.checked;
3270 desktopsettings.quality = d7bitmapquality.value;
3271 desktopsettings.scaling = d7bitmapscaling.value;
3272 + desktopsettings.framerate = d7framelimiter.value;
3273 localStorage.setItem('desktopsettings', JSON.stringify(desktopsettings));
3274 applyDesktopSettings();
3275 if (desktop) {
3276 if (desktop.contype == 1) {
3258 - if (desktop.State != 0) { desktop.m.SendCompressionLevel(1, desktopsettings.quality, desktopsettings.scaling); }
3277 + if (desktop.State != 0) { desktop.m.SendCompressionLevel(1, desktopsettings.quality, desktopsettings.scaling, desktopsettings.framerate); }
3278 }
3279 if (desktop.contype == 2) {
3280 if (desktopsettings.showfocus == false) { desktop.m.focusmode = 0; deskFocusBtn.value = 'All Focus'; }
@@ -3274,6 +3293,7 @@
3293 d7bitmapquality.value = 40; // Default value
3294 if (ops.indexOf(parseInt(desktopsettings.quality)) >= 0) { d7bitmapquality.value = desktopsettings.quality; }
3295 d7bitmapscaling.value = desktopsettings.scaling;
3296 + if (desktopsettings.framerate) { d7framelimiter.value = desktopsettings.framerate; }
3297 QV('deskFocusBtn', (desktop != null) && (desktop.contype == 2) && (desktop.state != 0) && (desktopsettings.showfocus));
3298 }
3299