mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-16 21:05:28 +03:00
Use async URL loading for the JSON setting definitions
Chrome disallows synchronous URL loading, so all functions requiring the JSON definitions for the settings over MSPv2 need to be async. This required rewriting MSPHelper._getSetting() and all its callers using promises. Fixes #284
This commit is contained in:
parent
244b646bd2
commit
850632bfee
2 changed files with 101 additions and 84 deletions
|
@ -2246,18 +2246,28 @@ var mspHelper = (function (gui) {
|
||||||
};
|
};
|
||||||
|
|
||||||
self._getSetting = function(name) {
|
self._getSetting = function(name) {
|
||||||
if (!this._settings) {
|
var promise;
|
||||||
var $this = this;
|
if (this._settings) {
|
||||||
$.ajax({
|
promise = Promise.resolve(this._settings);
|
||||||
url: chrome.extension.getURL('/resources/settings.json'),
|
} else {
|
||||||
dataType: 'json',
|
promise = new Promise(function(resolve, reject) {
|
||||||
async: false,
|
var $this = this;
|
||||||
success: function(data) {
|
$.ajax({
|
||||||
$this._settings = data;
|
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) {
|
self._encodeSettingName = function(name, data) {
|
||||||
|
@ -2268,89 +2278,94 @@ var mspHelper = (function (gui) {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.getSetting = function(name, callback) {
|
self.getSetting = function(name, callback) {
|
||||||
var setting = this._getSetting(name);
|
var $this = this;
|
||||||
var data = [];
|
return this._getSetting(name).then(function (setting) {
|
||||||
this._encodeSettingName(name, data);
|
var data = [];
|
||||||
MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) {
|
$this._encodeSettingName(name, data);
|
||||||
var value;
|
MSP.send_message(MSPCodes.MSPV2_SETTING, data, false, function(resp) {
|
||||||
switch (setting.type) {
|
var value;
|
||||||
case "uint8_t":
|
switch (setting.type) {
|
||||||
value = resp.data.getUint8(0);
|
case "uint8_t":
|
||||||
break;
|
value = resp.data.getUint8(0);
|
||||||
case "int8_t":
|
break;
|
||||||
value = resp.data.getInt8(0);
|
case "int8_t":
|
||||||
break;
|
value = resp.data.getInt8(0);
|
||||||
case "uint16_t":
|
break;
|
||||||
value = resp.data.getUint16(0, true);
|
case "uint16_t":
|
||||||
break;
|
value = resp.data.getUint16(0, true);
|
||||||
case "int16_t":
|
break;
|
||||||
value = resp.data.getInt16(0, true);
|
case "int16_t":
|
||||||
break;
|
value = resp.data.getInt16(0, true);
|
||||||
case "uint32_t":
|
break;
|
||||||
value = resp.data.getUint32(0, true);
|
case "uint32_t":
|
||||||
break;
|
value = resp.data.getUint32(0, true);
|
||||||
case "float":
|
break;
|
||||||
var fi32 = resp.data.getUint32(0, true);
|
case "float":
|
||||||
var buf = new ArrayBuffer(4);
|
var fi32 = resp.data.getUint32(0, true);
|
||||||
(new Uint32Array(buf))[0] = fi32;
|
var buf = new ArrayBuffer(4);
|
||||||
value = (new Float32Array(buf))[0];
|
(new Uint32Array(buf))[0] = fi32;
|
||||||
break;
|
value = (new Float32Array(buf))[0];
|
||||||
default:
|
break;
|
||||||
throw "Unknown setting type " + setting.type;
|
default:
|
||||||
}
|
throw "Unknown setting type " + setting.type;
|
||||||
if (setting.table) {
|
}
|
||||||
value = setting.table.values[value];
|
if (setting.table) {
|
||||||
}
|
value = setting.table.values[value];
|
||||||
if (callback) {
|
}
|
||||||
callback(value, setting);
|
if (callback) {
|
||||||
}
|
callback(value, setting);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
self.encodeSetting = function(name, value) {
|
self.encodeSetting = function(name, value) {
|
||||||
var setting = this._getSetting(name);
|
var $this = this;
|
||||||
if (setting.table) {
|
return this._getSetting(name).then(function (setting) {
|
||||||
var found = false;
|
if (setting.table) {
|
||||||
for (var ii = 0; ii < setting.table.values.length; ii++) {
|
var found = false;
|
||||||
if (setting.table.values[ii] == value) {
|
for (var ii = 0; ii < setting.table.values.length; ii++) {
|
||||||
value = ii;
|
if (setting.table.values[ii] == value) {
|
||||||
found = true;
|
value = ii;
|
||||||
break;
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
throw 'Invalid value "' + value + '" for setting ' + name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
var data = [];
|
||||||
throw 'Invalid value "' + value + '" for setting ' + name;
|
$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;
|
||||||
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) {
|
self.setSetting = function(name, value, callback) {
|
||||||
var data = this.encodeSetting(name, value);
|
this.encodeSetting(name, value).then(function (data) {
|
||||||
MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback);
|
MSP.send_message(MSPCodes.MSPV2_SET_SETTING, data, false, callback);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
|
|
@ -531,7 +531,9 @@ TABS.profiles.initialize = function (callback, scrollPosition) {
|
||||||
var settings = presets.settings.get(currentPreset.type);
|
var settings = presets.settings.get(currentPreset.type);
|
||||||
Object.keys(settings).forEach(function(key, ii) {
|
Object.keys(settings).forEach(function(key, ii) {
|
||||||
var value = settings[key];
|
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 () {
|
Promise.props(promises).then(function () {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue