diff --git a/js/msp/MSPHelper.js b/js/msp/MSPHelper.js index 0d8c0688..840c6fe8 100644 --- a/js/msp/MSPHelper.js +++ b/js/msp/MSPHelper.js @@ -2246,18 +2246,28 @@ var mspHelper = (function (gui) { }; self._getSetting = function(name) { - if (!this._settings) { - var $this = this; - $.ajax({ - url: chrome.extension.getURL('/resources/settings.json'), - dataType: 'json', - async: false, - success: function(data) { - $this._settings = data; - } + var promise; + if (this._settings) { + promise = Promise.resolve(this._settings); + } else { + promise = new Promise(function(resolve, reject) { + var $this = this; + $.ajax({ + url: chrome.runtime.getURL('/resources/settings.json'), + dataType: 'json', + error: function(jqXHR, text, error) { + reject(error); + }, + success: function(data) { + $this._settings = data; + resolve(data); + } + }); }); } - return this._settings[name]; + return promise.then(function (data) { + return data[name]; + }); }; self._encodeSettingName = function(name, data) { @@ -2268,89 +2278,94 @@ var mspHelper = (function (gui) { }; self.getSetting = function(name, callback) { - var setting = this._getSetting(name); - var data = []; - this._encodeSettingName(name, data); - MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) { - var value; + var $this = this; + return this._getSetting(name).then(function (setting) { + var data = []; + $this._encodeSettingName(name, data); + MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) { + var value; + switch (setting.type) { + case "uint8_t": + value = resp.data.getUint8(0); + break; + case "int8_t": + value = resp.data.getInt8(0); + break; + case "uint16_t": + value = resp.data.getUint16(0, true); + break; + case "int16_t": + value = resp.data.getInt16(0, true); + break; + case "uint32_t": + value = resp.data.getUint32(0, true); + break; + case "float": + var fi32 = resp.data.getUint32(0, true); + var buf = new ArrayBuffer(4); + (new Uint32Array(buf))[0] = fi32; + value = (new Float32Array(buf))[0]; + break; + default: + throw "Unknown setting type " + setting.type; + } + if (setting.table) { + value = setting.table.values[value]; + } + if (callback) { + callback(value, setting); + } + }); + }); + }; + + self.encodeSetting = function(name, value) { + var $this = this; + return this._getSetting(name).then(function (setting) { + if (setting.table) { + var found = false; + for (var ii = 0; ii < setting.table.values.length; ii++) { + if (setting.table.values[ii] == value) { + value = ii; + found = true; + break; + } + } + if (!found) { + throw 'Invalid value "' + value + '" for setting ' + name; + } + } + var data = []; + $this._encodeSettingName(name, data); switch (setting.type) { case "uint8_t": - value = resp.data.getUint8(0); - break; case "int8_t": - value = resp.data.getInt8(0); + data.push8(value); break; case "uint16_t": - value = resp.data.getUint16(0, true); - break; case "int16_t": - value = resp.data.getInt16(0, true); + data.push16(value); break; case "uint32_t": - value = resp.data.getUint32(0, true); + data.push32(value); break; case "float": - var fi32 = resp.data.getUint32(0, true); var buf = new ArrayBuffer(4); - (new Uint32Array(buf))[0] = fi32; - value = (new Float32Array(buf))[0]; + (new Float32Array(buf))[0] = value; + var if32 = (new Uint32Array(buf))[0]; + data.push32(if32); break; default: throw "Unknown setting type " + setting.type; } - if (setting.table) { - value = setting.table.values[value]; - } - if (callback) { - callback(value, setting); - } + return data; }); }; - self.encodeSetting = function(name, value) { - var setting = this._getSetting(name); - if (setting.table) { - var found = false; - for (var ii = 0; ii < setting.table.values.length; ii++) { - if (setting.table.values[ii] == value) { - value = ii; - found = true; - break; - } - } - if (!found) { - throw 'Invalid value "' + value + '" for setting ' + name; - } - } - var data = []; - this._encodeSettingName(name, data); - switch (setting.type) { - case "uint8_t": - case "int8_t": - data.push8(value); - break; - case "uint16_t": - case "int16_t": - data.push16(value); - break; - case "uint32_t": - data.push32(value); - break; - case "float": - var buf = new ArrayBuffer(4); - (new Float32Array(buf))[0] = value; - var if32 = (new Uint32Array(buf))[0]; - data.push32(if32); - break; - default: - throw "Unknown setting type " + setting.type; - } - return data; - }; - self.setSetting = function(name, value, callback) { - var data = this.encodeSetting(name, value); - MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback); + this.encodeSetting(name, value).then(function (data) { + MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback); + }); }; return self; diff --git a/tabs/profiles.js b/tabs/profiles.js index 1e0cba51..def4f3f1 100644 --- a/tabs/profiles.js +++ b/tabs/profiles.js @@ -531,7 +531,9 @@ TABS.profiles.initialize = function (callback, scrollPosition) { var settings = presets.settings.get(currentPreset.type); Object.keys(settings).forEach(function(key, ii) { var value = settings[key]; - promises[key] = MSP.promise(MSPCodes.MSPV2_SET_SETTING, mspHelper.encodeSetting(key, value)); + promises[key] = mspHelper.encodeSetting(key, value).then(function(data) { + return MSP.promise(MSPCodes.MSPV2_SET_SETTING, data); + }); }); } Promise.props(promises).then(function () {