diff --git a/js/kiri.js b/js/kiri.js index f1fbf3d5..6de6ac3a 100644 --- a/js/kiri.js +++ b/js/kiri.js @@ -10,6 +10,13 @@ self.kiri.license = exports.LICENSE; (function () { if (kiri.init) return; + function genID() { + while (true) { + var k = Math.round(Math.random() * 9999999999).toString(36); + if (k.length >= 4 && k.length <= 8) return k; + } + } + var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent), // --------------- MODES = { @@ -408,7 +415,9 @@ self.kiri.license = exports.LICENSE; zoomSpeed: 1.0, reverseZoom: true }, - mode: 'FDM' + mode: 'FDM', + id: genID(), + ver: 1 }, settingsDefault = settings, autoDecimate = true, @@ -1716,6 +1725,7 @@ self.kiri.license = exports.LICENSE; // kiri api function putSettings(newset) { + console.log({new_settings:newset}); settings = newset; saveSettings() restoreWorkspace(null, true); @@ -2583,6 +2593,9 @@ self.kiri.license = exports.LICENSE; case cca('c'): // open control window showSerial(true); break; + case cca('u'): // full settings url + storeSettingsToServer(); + break; case cca('s'): // complete slice prepareSlices(); break; @@ -2692,6 +2705,38 @@ self.kiri.license = exports.LICENSE; moveSelection(x, y, z, true); } + function loadSettingsFromServer() { + var hash = LOC.hash.substring(1).split("/"); + if (hash.length === 2) { + new moto.Ajax(function(reply) { + if (reply) { + var res = JSON.parse(reply); + if (res && res.ver && res.rec) { + var set = JSON.parse(atob(res.rec)); + set.id = res.space; + set.ver = res.ver; + putSettings(set); + LOC.hash = ''; + } + } + }).request("/data/"+ hash[0] + "/" + hash[1]); + } + } + + function storeSettingsToServer() { + var set = btoa(JSON.stringify(settings)); + new moto.Ajax(function(reply) { + if (reply) { + var res = JSON.parse(reply); + if (res && res.ver) { + LOC.hash = res.space + "/" + res.ver; + } + } else { + updateSpaceState(); + } + }).request("/data/"+ settings.id + "/" + settings.ver, set); + } + function settingsSave() { hideDialog(); var mode = getMode(), @@ -3367,6 +3412,9 @@ self.kiri.license = exports.LICENSE; // send init-done event sendOnEvent('init-done', STATS); + + // load settings provided in url hash + loadSettingsFromServer(); } restoreWorkspace(ondone) || checkSeed(ondone) || ondone(); diff --git a/js/web-server.js b/js/web-server.js index e95170b2..811dcf93 100644 --- a/js/web-server.js +++ b/js/web-server.js @@ -368,6 +368,8 @@ function addCorsHeaders(req, res) { } /** + * meta:moto data storage and retrieval url + * * @param {Object} req * @param {Object} res * @param {Function} next diff --git a/notes.md b/notes.md index 2d02f84b..25a911ed 100644 --- a/notes.md +++ b/notes.md @@ -59,7 +59,7 @@ # FDM todo -* add support expand to multi-part spacing +* add support expand value to multi-part spacing (which defaults to 1mm) * add lay-flat auto-rotation or from selected face * add rafts, thin wall detection, manual supports * check for support / brim intersections on first layer