commit
91a63e05cf
|
@ -39,7 +39,21 @@
|
|||
},
|
||||
|
||||
"backupFileIncompatible": {
|
||||
"message": "Backup file provided was generated for older version of configurator and is incompatible with this version of configurator. Sorry"
|
||||
"message": "Backup file provided was generated for previous version of the configurator and is incompatible with this version of configurator. Sorry"
|
||||
},
|
||||
|
||||
"backupFileUnmigratable": {
|
||||
"message": "Backup file provided was generated by a previous version of the configurator and is not migratable. Sorry."
|
||||
},
|
||||
|
||||
"configMigrationFrom": {
|
||||
"message": "Migrating configuration file generated by configurator: $1"
|
||||
},
|
||||
"configMigratedTo": {
|
||||
"message": "Migrated configuration to configurator: $1"
|
||||
},
|
||||
"configMigrationSuccessful": {
|
||||
"message": "Configuration migration complete, migrations applied: $1"
|
||||
},
|
||||
|
||||
"tabSetup": {
|
||||
|
@ -85,7 +99,7 @@
|
|||
"tabAuxiliary": {
|
||||
"message": "Modes"
|
||||
},
|
||||
|
||||
|
||||
"serialPortOpened": {
|
||||
"message": "Serial port <span style=\"color: green\">successfully</span> opened with ID: $1"
|
||||
},
|
||||
|
@ -103,7 +117,15 @@
|
|||
"message": "No configuration received within <span style=\"color: red\">10 seconds</span>, communication <span style=\"color: red\">failed</span>"
|
||||
},
|
||||
"firmwareVersionNotSupported": {
|
||||
"message": "This firmware version is <span style=\"color: red\">not supported</span>. Please upgrade to firmware that supports api version <strong>$1</strong> or higher. Only CLI is usable for backup purposes."
|
||||
"message": "This firmware version is <span style=\"color: red\">not supported</span>. Please upgrade to firmware that supports api version <strong>$1</strong> or higher. Use CLI for backup before flashing. CLI backup/restore procedure is in the documention."
|
||||
},
|
||||
|
||||
"tabSwitchConnectionRequired": {
|
||||
"message": "You need to <strong>connect</strong> before you can view any of the tabs."
|
||||
},
|
||||
|
||||
"tabSwitchUpgradeRequired": {
|
||||
"message": "You need to <strong>upgrade</strong> your firmware before you can view any of the tabs."
|
||||
},
|
||||
"firmwareVersion": {
|
||||
"message": "Firmware Version: <strong>$1</strong>"
|
||||
|
@ -347,6 +369,9 @@
|
|||
"configurationReceiver": {
|
||||
"message": "Receiver Mode"
|
||||
},
|
||||
"configurationFailsafe": {
|
||||
"message": "Receiver failsafe"
|
||||
},
|
||||
"configurationRSSI": {
|
||||
"message": "RSSI (Signal Strength)"
|
||||
},
|
||||
|
@ -510,8 +535,8 @@
|
|||
"receiverChannelMapTitle": {
|
||||
"message": "You can define your own channel map by clicking inside the box"
|
||||
},
|
||||
"receiverRssiAux": {
|
||||
"message": "RSSI on AUX"
|
||||
"receiverRssiChannel": {
|
||||
"message": "RSSI Channel"
|
||||
},
|
||||
"receiverRefreshRateTitle": {
|
||||
"message": "Graph refresh rate"
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
<span>2015.01.07 - 0.59.1 - cleanflight</span>
|
||||
<p>
|
||||
- Update RSSI channel section to allow any channel.<br />
|
||||
- Implemented configuration migration to aid with backwards compatibility.<br />
|
||||
- Allow CLI access when connecting firmware with an out-of-date API.
|
||||
</p>
|
||||
<span>2015.01.04 - 0.59.0 - cleanflight</span>
|
||||
<p>
|
||||
- Overhaul configuration tab.<br />
|
||||
|
|
|
@ -225,7 +225,7 @@ function configuration_restore(callback) {
|
|||
console.log('Read SUCCESSFUL');
|
||||
|
||||
try { // check if string provided is a valid JSON
|
||||
var deserialized_configuration_object = JSON.parse(e.target.result);
|
||||
var configuration = JSON.parse(e.target.result);
|
||||
} catch (e) {
|
||||
// data provided != valid json object
|
||||
console.log('Data provided != valid JSON string, restore aborted.');
|
||||
|
@ -233,7 +233,23 @@ function configuration_restore(callback) {
|
|||
return;
|
||||
}
|
||||
|
||||
configuration_upload(deserialized_configuration_object, callback);
|
||||
// validate
|
||||
if (typeof configuration.generatedBy !== 'undefined' && compareVersions(configuration.generatedBy, CONFIGURATOR.backupFileMinVersionAccepted)) {
|
||||
|
||||
if (configuration.generatedBy != chrome.runtime.getManifest().version) {
|
||||
if (!migrate(configuration)) {
|
||||
GUI.log(chrome.i18n.getMessage('backupFileUnmigratable'));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
configuration_upload(configuration, callback);
|
||||
|
||||
} else {
|
||||
GUI.log(chrome.i18n.getMessage('backupFileIncompatible'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -241,33 +257,51 @@ function configuration_restore(callback) {
|
|||
});
|
||||
});
|
||||
|
||||
function configuration_upload(configuration, callback) {
|
||||
function compareVersions(generated, required) {
|
||||
var a = generated.split('.'),
|
||||
b = required.split('.');
|
||||
function compareVersions(generated, required) {
|
||||
var a = generated.split('.'),
|
||||
b = required.split('.');
|
||||
|
||||
for (var i = 0; i < a.length; ++i) {
|
||||
a[i] = Number(a[i]);
|
||||
}
|
||||
for (var i = 0; i < b.length; ++i) {
|
||||
b[i] = Number(b[i]);
|
||||
}
|
||||
if (a.length == 2) {
|
||||
a[2] = 0;
|
||||
}
|
||||
|
||||
if (a[0] > b[0]) return true;
|
||||
if (a[0] < b[0]) return false;
|
||||
|
||||
if (a[1] > b[1]) return true;
|
||||
if (a[1] < b[1]) return false;
|
||||
|
||||
if (a[2] > b[2]) return true;
|
||||
if (a[2] < b[2]) return false;
|
||||
|
||||
return true;
|
||||
for (var i = 0; i < a.length; ++i) {
|
||||
a[i] = Number(a[i]);
|
||||
}
|
||||
for (var i = 0; i < b.length; ++i) {
|
||||
b[i] = Number(b[i]);
|
||||
}
|
||||
if (a.length == 2) {
|
||||
a[2] = 0;
|
||||
}
|
||||
|
||||
if (a[0] > b[0]) return true;
|
||||
if (a[0] < b[0]) return false;
|
||||
|
||||
if (a[1] > b[1]) return true;
|
||||
if (a[1] < b[1]) return false;
|
||||
|
||||
if (a[2] > b[2]) return true;
|
||||
if (a[2] < b[2]) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function migrate(configuration) {
|
||||
var appliedMigrationsCount = 0;
|
||||
var migratedVersion = configuration.generatedBy;
|
||||
GUI.log(chrome.i18n.getMessage('configMigrationFrom', [migratedVersion]));
|
||||
|
||||
if (!compareVersions(migratedVersion, '0.59.1')) {
|
||||
|
||||
configuration.MISC.rssi_channel = configuration.MISC.rssi_aux_channel; // variable was renamed
|
||||
configuration.MISC.rssi_aux_channel = undefined;
|
||||
|
||||
migratedVersion = '0.59.1';
|
||||
GUI.log(chrome.i18n.getMessage('configMigratedTo', [migratedVersion]));
|
||||
appliedMigrationsCount++;
|
||||
}
|
||||
GUI.log(chrome.i18n.getMessage('configMigrationSuccessful', [appliedMigrationsCount]));
|
||||
return true;
|
||||
}
|
||||
|
||||
function configuration_upload(configuration, callback) {
|
||||
function upload() {
|
||||
var activeProfile = null,
|
||||
profilesN = 3;
|
||||
|
@ -405,11 +439,6 @@ function configuration_restore(callback) {
|
|||
}
|
||||
}
|
||||
|
||||
// validate
|
||||
if (typeof configuration.generatedBy !== 'undefined' && compareVersions(configuration.generatedBy, CONFIGURATOR.backupFileMinVersionAccepted)) {
|
||||
upload();
|
||||
} else {
|
||||
GUI.log(chrome.i18n.getMessage('backupFileIncompatible'));
|
||||
}
|
||||
upload();
|
||||
}
|
||||
}
|
|
@ -132,7 +132,7 @@ var MISC = {
|
|||
gps_baudrate: 0,
|
||||
gps_ubx_sbas: 0,
|
||||
multiwiicurrentoutput: 0,
|
||||
rssi_aux_channel: 0,
|
||||
rssi_channel: 0,
|
||||
placeholder2: 0,
|
||||
mag_declination: 0, // not checked
|
||||
vbatscale: 0,
|
||||
|
|
10
js/msp.js
10
js/msp.js
|
@ -321,7 +321,7 @@ var MSP = {
|
|||
MISC.gps_baudrate = data.getUint8(11);
|
||||
MISC.gps_ubx_sbas = data.getInt8(12);
|
||||
MISC.multiwiicurrentoutput = data.getUint8(13);
|
||||
MISC.rssi_aux_channel = data.getUint8(14);
|
||||
MISC.rssi_channel = data.getUint8(14);
|
||||
MISC.placeholder2 = data.getUint8(15);
|
||||
MISC.mag_declination = data.getInt16(16, 1) / 10; // -18000-18000
|
||||
MISC.vbatscale = data.getUint8(18, 1); // 10-200
|
||||
|
@ -482,7 +482,7 @@ var MSP = {
|
|||
break;
|
||||
case MSP_codes.MSP_SET_BF_CONFIG:
|
||||
break;
|
||||
case MSP_codes.MSP_REBOOT:
|
||||
case MSP_codes.MSP_SET_REBOOT:
|
||||
console.log('Reboot request accepted');
|
||||
break;
|
||||
|
||||
|
@ -563,6 +563,10 @@ var MSP = {
|
|||
offset+= 4;
|
||||
break;
|
||||
|
||||
case MSP_codes.MSP_SET_CF_SERIAL_CONFIG:
|
||||
console.log('Serial config saved');
|
||||
break;
|
||||
|
||||
case MSP_codes.MSP_MODE_RANGES:
|
||||
MODE_RANGES = []; // empty the array as new data is coming in
|
||||
|
||||
|
@ -819,7 +823,7 @@ MSP.crunch = function (code) {
|
|||
buffer.push(MISC.gps_baudrate);
|
||||
buffer.push(MISC.gps_ubx_sbas);
|
||||
buffer.push(MISC.multiwiicurrentoutput);
|
||||
buffer.push(MISC.rssi_aux_channel);
|
||||
buffer.push(MISC.rssi_channel);
|
||||
buffer.push(MISC.placeholder2);
|
||||
buffer.push(lowByte(MISC.mag_declination * 10));
|
||||
buffer.push(highByte(MISC.mag_declination * 10));
|
||||
|
|
4
main.js
4
main.js
|
@ -63,12 +63,12 @@ $(document).ready(function () {
|
|||
tab = $(self).parent().prop('class');
|
||||
|
||||
if (!CONFIGURATOR.connectionValid) {
|
||||
GUI.log('You need to <strong>connect</strong> before you can view any of the tabs');
|
||||
GUI.log('tabSwitchConnectionRequired');
|
||||
return;
|
||||
}
|
||||
|
||||
if (CONFIGURATOR.connectionValidCliOnly) {
|
||||
GUI.log('You need to <strong>upgrade</strong> your firmware before you can view any of the tabs. Use CLI for backup before flashing!');
|
||||
GUI.log(chrome.i18n.getMessage('tabSwitchUpgradeRequired'));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"manifest_version": 2,
|
||||
"minimum_chrome_version": "38",
|
||||
"version": "0.59.0",
|
||||
"version": "0.59.1",
|
||||
"author": "Hydra",
|
||||
"name": "Cleanflight - Configurator",
|
||||
"short_name": "cleanflight",
|
||||
|
|
|
@ -44,12 +44,6 @@
|
|||
<span i18n="configurationThrottleMaximum"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="failsafe_throttle" min="0" max="2000" />
|
||||
<span i18n="configurationThrottleFailsafe"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="mincommand" min="0" max="2000" />
|
||||
|
@ -137,13 +131,94 @@
|
|||
<th i18n="configurationFeatureDescription"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="features rxMisc">
|
||||
<tbody class="features rxFailsafe">
|
||||
<!-- table generated here -->
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="failsafe_throttle" min="0" max="2000" />
|
||||
<span i18n="configurationThrottleFailsafe"></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="rightWrapper gps">
|
||||
<div class="rightWrapper current voltage">
|
||||
<div class="groupTitle" i18n="configurationBatteryVoltage"></div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th i18n="configurationFeatureEnabled"></th>
|
||||
<th i18n="configurationFeatureName"></th>
|
||||
<th i18n="configurationFeatureDescription"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="features batteryVoltage">
|
||||
<!-- table generated here -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="mincellvoltage" step="0.1" min="1" max="5" />
|
||||
<span i18n="configurationBatteryMinimum"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="maxcellvoltage" step="0.1" min="1" max="5" />
|
||||
<span i18n="configurationBatteryMaximum"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="warningcellvoltage" step="0.1" min="1" max="5" />
|
||||
<span i18n="configurationBatteryWarning"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="voltagescale" step="1" min="10" max="200" />
|
||||
<span i18n="configurationBatteryScale"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="groupTitle" i18n="configurationCurrent"></div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th i18n="configurationFeatureEnabled"></th>
|
||||
<th i18n="configurationFeatureName"></th>
|
||||
<th i18n="configurationFeatureDescription"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="features batteryCurrent">
|
||||
<!-- table generated here -->
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="currentscale" step="1" min="1" max="1000" />
|
||||
<span i18n="configurationCurrentScale"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="currentoffset" step="1" min="1" max="1000" />
|
||||
<span i18n="configurationCurrentOffset"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<div>
|
||||
<input type="checkbox" name="multiwiicurrentoutput" />
|
||||
</div>
|
||||
<span i18n="configurationBatteryMultiwiiCurrent"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clear-both"></div>
|
||||
<div class="leftWrapper gps">
|
||||
<div class="groupTitle" i18n="configurationGPS"></div>
|
||||
<table>
|
||||
<thead>
|
||||
|
@ -183,84 +258,7 @@
|
|||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clear-both"></div>
|
||||
<div class="leftWrapper">
|
||||
<div class="groupTitle" i18n="configurationBatteryVoltage"></div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th i18n="configurationFeatureEnabled"></th>
|
||||
<th i18n="configurationFeatureName"></th>
|
||||
<th i18n="configurationFeatureDescription"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="features batteryVoltage">
|
||||
<!-- table generated here -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="mincellvoltage" step="0.1" min="1" max="5" />
|
||||
<span i18n="configurationBatteryMinimum"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="maxcellvoltage" step="0.1" min="1" max="5" />
|
||||
<span i18n="configurationBatteryMaximum"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="warningcellvoltage" step="0.1" min="1" max="5" />
|
||||
<span i18n="configurationBatteryWarning"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="voltagescale" step="1" min="10" max="200" />
|
||||
<span i18n="configurationBatteryScale"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="rightWrapper current">
|
||||
<div class="groupTitle" i18n="configurationCurrent"></div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th i18n="configurationFeatureEnabled"></th>
|
||||
<th i18n="configurationFeatureName"></th>
|
||||
<th i18n="configurationFeatureDescription"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="features batteryCurrent">
|
||||
<!-- table generated here -->
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="currentscale" step="1" min="1" max="1000" />
|
||||
<span i18n="configurationCurrentScale"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="number">
|
||||
<label>
|
||||
<input type="number" name="currentoffset" step="1" min="1" max="1000" />
|
||||
<span i18n="configurationCurrentOffset"></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<div>
|
||||
<input type="checkbox" name="multiwiicurrentoutput" />
|
||||
</div>
|
||||
<span i18n="configurationBatteryMultiwiiCurrent"></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clear-both"></div>
|
||||
<div class="leftWrapper">
|
||||
<div class="rightWrapper">
|
||||
<div class="groupTitle" i18n="configurationFeatures"></div>
|
||||
<table>
|
||||
<thead>
|
||||
|
|
|
@ -76,7 +76,8 @@ TABS.configuration.initialize = function (callback, scrollPosition) {
|
|||
{bit: 15, group: 'rssi', name: 'RSSI_ADC', description: 'Analog RSSI input'},
|
||||
{bit: 16, group: 'other', name: 'LED_STRIP', description: 'Addressable RGB LED strip support'},
|
||||
{bit: 17, group: 'other', name: 'DISPLAY', description: 'OLED Screen Display'},
|
||||
{bit: 18, group: 'esc', name: 'ONESHOT125', description: 'ONESHOT ESC support (disconnect ESCs, remove props)'}
|
||||
{bit: 18, group: 'esc', name: 'ONESHOT125', description: 'ONESHOT ESC support (disconnect ESCs, remove props)'},
|
||||
{bit: 19, group: 'other', name: 'BLACKBOX', description: 'Blackbox flight data recorder'}
|
||||
];
|
||||
|
||||
var radioGroups = [];
|
||||
|
|
|
@ -37,7 +37,9 @@ TABS.ports.initialize = function (callback, scrollPosition) {
|
|||
'CLI',
|
||||
'GPS Passthrough',
|
||||
'MSP',
|
||||
'SmartPort Telemetry'
|
||||
'SmartPort Telemetry',
|
||||
'Blackbox',
|
||||
'MSP, CLI, Blackbox (when armed), GPS Passthrough'
|
||||
];
|
||||
|
||||
var portIdentifierToNameMapping = {
|
||||
|
|
|
@ -127,7 +127,7 @@
|
|||
line-height: 20px;
|
||||
text-align: right;
|
||||
}
|
||||
.tab-receiver .rssi_aux_wrapper {
|
||||
.tab-receiver .rssi_channel_wrapper {
|
||||
float: right;
|
||||
|
||||
margin: 10px 0 0 0;
|
||||
|
@ -137,7 +137,7 @@
|
|||
border: 1px solid #8b8b8b;
|
||||
border-left: 0;
|
||||
}
|
||||
.tab-receiver .rssi_aux_wrapper .head {
|
||||
.tab-receiver .rssi_channel_wrapper .head {
|
||||
height: 15px;
|
||||
padding: 4px;
|
||||
|
||||
|
@ -147,7 +147,7 @@
|
|||
border-bottom: 1px solid #8b8b8b;
|
||||
background-color: #ececec;
|
||||
}
|
||||
.tab-receiver .rssi_aux_wrapper select {
|
||||
.tab-receiver .rssi_channel_wrapper select {
|
||||
width: 100%;
|
||||
height: 22px;
|
||||
|
||||
|
|
|
@ -22,14 +22,10 @@
|
|||
<td><input type="number" name="expo" step="0.01" min="0" max="1" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="rssi_aux_wrapper">
|
||||
<div class="head" i18n="receiverRssiAux"></div>
|
||||
<select name="rssi_aux_channel">
|
||||
<option value="0">Disabled</option>
|
||||
<option value="1">1</option>
|
||||
<option value="2">2</option>
|
||||
<option value="3">3</option>
|
||||
<option value="4">4</option>
|
||||
<div class="rssi_channel_wrapper">
|
||||
<div class="head" i18n="receiverRssiChannel"></div>
|
||||
<select name="rssi_channel">
|
||||
<!-- list generated here -->
|
||||
</select>
|
||||
</div>
|
||||
<div class="rcmap_wrapper">
|
||||
|
|
|
@ -162,8 +162,14 @@ TABS.receiver.initialize = function (callback) {
|
|||
$('input[name="rcmap"]').val($(this).val());
|
||||
});
|
||||
|
||||
// rssi aux
|
||||
$('select[name="rssi_aux_channel"]').val(MISC.rssi_aux_channel);
|
||||
// rssi
|
||||
var rssi_channel_e = $('select[name="rssi_channel"]');
|
||||
rssi_channel_e.append('<option value="0">Disabled</option>');
|
||||
for (var i = 0; i < RC.active_channels; i++) {
|
||||
rssi_channel_e.append('<option value="' + i + '">' + i + '</option>');
|
||||
}
|
||||
|
||||
$('select[name="rssi_channel"]').val(MISC.rssi_channel);
|
||||
|
||||
// UI Hooks
|
||||
// curves
|
||||
|
@ -272,7 +278,7 @@ TABS.receiver.initialize = function (callback) {
|
|||
}
|
||||
|
||||
// catch rssi aux
|
||||
MISC.rssi_aux_channel = parseInt($('select[name="rssi_aux_channel"]').val());
|
||||
MISC.rssi_channel = parseInt($('select[name="rssi_channel"]').val());
|
||||
|
||||
function save_rc_map() {
|
||||
MSP.send_message(MSP_codes.MSP_SET_RCMAP, MSP.crunch(MSP_codes.MSP_SET_RCMAP), false, save_misc);
|
||||
|
|
Loading…
Reference in New Issue