Move GPS configuration to GPS tab (#3326)

master
Mark Haslinghuis 2023-02-08 23:24:04 +01:00 committed by GitHub
parent 1906b3a82c
commit 309bd43128
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 318 additions and 249 deletions

View File

@ -1410,7 +1410,7 @@
"message": "<strong>Note:</strong> Make sure your FC is able to operate at these speeds! Check CPU and cycletime stability. Changing this may require PID re-tuning. TIP: Disable Accelerometer and other sensors to gain more performance."
},
"configurationGPS": {
"message": "GPS"
"message": "GPS Configuration"
},
"configurationGPSProtocol": {
"message": "Protocol"
@ -1443,9 +1443,6 @@
"message": "When enabled, only the first arm after the battery is connected will be used as home point. If not enabled, every time the quad is armed, the home point will be updated.",
"description": "Help text for the option to set the Home Point with the first arm only, not with each arm in the GPS Configuration"
},
"configurationGPSHelp": {
"message": "<strong>Note:</strong> Remember to configure a Serial Port (via Ports tab) when using GPS feature."
},
"configurationSerialRX": {
"message": "Serial Receiver Provider"
},

View File

@ -111,40 +111,6 @@
margin-bottom: 0;
}
}
.gps {
.line {
clear: left;
}
select {
float: left;
width: 100px;
height: 20px;
margin: 0 10px 5px 0;
border: 1px solid var(--subtleAccent);
}
.select {
>div {
&:first-child {
float: left;
height: 20px;
margin-right: 15px;
margin-left: 3px;
}
}
}
span {
line-height: 20px;
}
.gui_box {
float: left;
margin-bottom: 10px;
}
td {
&:nth-child(2) {
width: 38px;
}
}
}
.freelabel {
margin-left: 10px;
position: relative;
@ -340,11 +306,6 @@
float: left;
width: 100%;
}
.gpsSettings {
.note {
margin-top: 10px;
}
}
}
@media only screen and (max-width: 1055px) {
.tab-configuration {

View File

@ -40,6 +40,80 @@
.gps_map {
height: 460px;
}
.gps_config {
font-size: 11px;
.line {
clear: left;
}
select {
float: left;
width: 100px;
height: 20px;
margin: 0 10px 5px 0;
border: 1px solid var(--subtleAccent);
}
.select {
>div {
&:first-child {
float: left;
height: 20px;
margin-right: 15px;
margin-left: 3px;
}
}
}
span {
line-height: 20px;
}
.gui_box {
float: left;
margin-bottom: 10px;
}
td {
&:nth-child(2) {
width: 38px;
}
}
}
dl.features {
dt {
float: left;
width: 10px;
height: 18px;
line-height: 18px;
input {
margin-top: 2px;
}
}
dd {
margin: 0 0 0 20px;
height: 18px;
line-height: 18px;
}
}
.freelabel {
margin-left: 10px;
position: relative;
}
.spacer_box {
padding-bottom: 10px;
float: left;
width: calc(100% - 20px);
}
.select {
margin-bottom: 5px;
clear: left;
padding-bottom: 5px;
border-bottom: 1px solid var(--subtleAccent);
width: 100%;
float: left;
&:last-child {
border-bottom: none;
padding-bottom: 0;
margin-bottom: 0;
}
}
#connect {
display: none;
text-align: center;

View File

@ -37,7 +37,7 @@ const Features = function (config) {
);
}
self._features = features;
self._features = features.sort((a, b) => a.name.localeCompare(b.name, window.navigator.language, { ignorePunctuation: true }));
self._featureMask = 0;
self._analyticsChanges = {};

View File

@ -33,7 +33,6 @@ configuration.initialize = function (callback) {
.then(() => MSP.promise(MSPCodes.MSP_FEATURE_CONFIG))
.then(() => MSP.promise(MSPCodes.MSP_BEEPER_CONFIG))
.then(() => MSP.promise(MSPCodes.MSP_BOARD_ALIGNMENT_CONFIG))
.then(() => MSP.promise(MSPCodes.MSP_GPS_CONFIG))
.then(() => MSP.promise(MSPCodes.MSP_ACC_TRIM))
.then(() => MSP.promise(MSPCodes.MSP_ARMING_CONFIG))
.then(() => MSP.promise(MSPCodes.MSP_RC_DEADBAND))
@ -336,99 +335,6 @@ configuration.initialize = function (callback) {
$('input[name="fpvCamAngleDegrees"]').val(FC.RX_CONFIG.fpvCamAngleDegrees);
$('input[name="fpvCamAngleDegrees"]').attr("max", 90);
// generate GPS
const gpsProtocols = [
'NMEA',
'UBLOX',
'MSP',
];
const gpsBaudRates = [
'115200',
'57600',
'38400',
'19200',
'9600',
];
const gpsSbas = [
i18n.getMessage('gpsSbasAutoDetect'),
i18n.getMessage('gpsSbasEuropeanEGNOS'),
i18n.getMessage('gpsSbasNorthAmericanWAAS'),
i18n.getMessage('gpsSbasJapaneseMSAS'),
i18n.getMessage('gpsSbasIndianGAGAN'),
];
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
gpsSbas.push(i18n.getMessage('gpsSbasNone'));
}
const gpsProtocolElement = $('select.gps_protocol');
const gpsAutoBaudElement = $('input[name="gps_auto_baud"]');
const gpsAutoBaudGroup = $('.gps_auto_baud');
const gpsAutoConfigElement = $('input[name="gps_auto_config"]');
const gpsAutoConfigGroup = $('.gps_auto_config');
const gpsUbloxGalileoElement = $('input[name="gps_ublox_galileo"]');
const gpsUbloxGalileoGroup = $('.gps_ublox_galileo');
const gpsUbloxSbasElement = $('select.gps_ubx_sbas');
const gpsUbloxSbasGroup = $('.gps_ubx_sbas');
const gpsHomeOnceElement = $('input[name="gps_home_once"]');
const gpsBaudrateElement = $('select.gps_baudrate');
for (let protocolIndex = 0; protocolIndex < gpsProtocols.length; protocolIndex++) {
gpsProtocolElement.append(`<option value="${protocolIndex}">${gpsProtocols[protocolIndex]}</option>`);
}
gpsProtocolElement.change(function () {
FC.GPS_CONFIG.provider = parseInt($(this).val());
// Call this to enable or disable auto config elements depending on the protocol
gpsAutoConfigElement.change();
}).val(FC.GPS_CONFIG.provider).change();
gpsAutoBaudElement.prop('checked', FC.GPS_CONFIG.auto_baud === 1);
gpsAutoConfigElement.change(function () {
const checked = $(this).is(":checked");
const ubloxSelected = FC.GPS_CONFIG.provider === gpsProtocols.indexOf('UBLOX');
const enableGalileoVisible = checked && ubloxSelected && semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43);
gpsUbloxGalileoGroup.toggle(enableGalileoVisible);
const enableSbasVisible = checked && ubloxSelected;
gpsUbloxSbasGroup.toggle(enableSbasVisible);
}).prop('checked', FC.GPS_CONFIG.auto_config === 1).change();
gpsAutoBaudGroup.show();
gpsAutoConfigGroup.show();
gpsUbloxGalileoElement.change(function() {
FC.GPS_CONFIG.ublox_use_galileo = $(this).is(':checked') ? 1 : 0;
}).prop('checked', FC.GPS_CONFIG.ublox_use_galileo > 0).change();
for (let sbasIndex = 0; sbasIndex < gpsSbas.length; sbasIndex++) {
gpsUbloxSbasElement.append(`<option value="${sbasIndex}">${gpsSbas[sbasIndex]}</option>`);
}
gpsUbloxSbasElement.change(function () {
FC.GPS_CONFIG.ublox_sbas = parseInt($(this).val());
}).val(FC.GPS_CONFIG.ublox_sbas);
$('.gps_home_once').toggle(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43));
gpsHomeOnceElement.change(function() {
FC.GPS_CONFIG.home_point_once = $(this).is(':checked') ? 1 : 0;
}).prop('checked', FC.GPS_CONFIG.home_point_once > 0).change();
for (let baudRateIndex = 0; baudRateIndex < gpsBaudRates.length; baudRateIndex++) {
gpsBaudrateElement.append(`<option value="${gpsBaudRates[baudRateIndex]}">${gpsBaudRates[baudRateIndex]}</option>`);
}
gpsBaudrateElement.prop("disabled", true);
gpsBaudrateElement.parent().hide();
// fill board alignment
$('input[name="board_align_roll"]').val(FC.BOARD_ALIGNMENT_CONFIG.roll);
$('input[name="board_align_pitch"]').val(FC.BOARD_ALIGNMENT_CONFIG.pitch);
@ -514,12 +420,10 @@ configuration.initialize = function (callback) {
self.analyticsChanges = {};
// fill some data
FC.GPS_CONFIG.auto_baud = $('input[name="gps_auto_baud"]').is(':checked') ? 1 : 0;
FC.GPS_CONFIG.auto_config = $('input[name="gps_auto_config"]').is(':checked') ? 1 : 0;
FC.SENSOR_CONFIG.acc_hardware = $('input[id="accHardwareSwitch"]').is(':checked') ? 0 : 1;
FC.SENSOR_CONFIG.baro_hardware = $('input[id="baroHardwareSwitch"]').is(':checked') ? 0 : 1;
FC.SENSOR_CONFIG.mag_hardware = $('input[id="magHardwareSwitch"]').is(':checked') ? 0 : 1;
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_45)) {
FC.CONFIG.craftName = $('input[name="craftName"]').val().trim();
FC.CONFIG.pilotName = $('input[name="pilotName"]').val().trim();
@ -537,7 +441,6 @@ configuration.initialize = function (callback) {
.then(() => MSP.promise(MSPCodes.MSP_SET_FEATURE_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FEATURE_CONFIG)))
.then(() => MSP.promise(MSPCodes.MSP_SET_BEEPER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_BEEPER_CONFIG)))
.then(() => MSP.promise(MSPCodes.MSP_SET_BOARD_ALIGNMENT_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_BOARD_ALIGNMENT_CONFIG)))
.then(() => MSP.promise(MSPCodes.MSP_SET_GPS_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_GPS_CONFIG)))
.then(() => MSP.promise(MSPCodes.MSP_SET_RC_DEADBAND, mspHelper.crunch(MSPCodes.MSP_SET_RC_DEADBAND)))
.then(() => MSP.promise(MSPCodes.MSP_SET_SENSOR_ALIGNMENT, mspHelper.crunch(MSPCodes.MSP_SET_SENSOR_ALIGNMENT)))
.then(() => MSP.promise(MSPCodes.MSP_SET_ADVANCED_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_ADVANCED_CONFIG)))

View File

@ -1,23 +1,32 @@
import { i18n } from "../localization";
import semver from 'semver';
import { API_VERSION_1_43 } from '../data_storage';
import GUI, { TABS } from '../gui';
import { have_sensor } from "../sensor_helpers";
import FC from '../fc';
import MSP from "../msp";
import MSPCodes from "../msp/MSPCodes";
import { gui_log } from '../gui_log';
import { have_sensor } from "../sensor_helpers";
import { mspHelper } from '../msp/MSPHelper';
import { reinitializeConnection } from '../serial_backend';
import { updateTabList } from '../utils/updateTabList';
const gps = {};
gps.initialize = function (callback) {
if (GUI.active_tab !== 'gps') {
GUI.active_tab = 'gps';
}
gps.initialize = async function (callback) {
GUI.active_tab = 'gps';
await MSP.promise(MSPCodes.MSP_FEATURE_CONFIG);
await MSP.promise(MSPCodes.MSP_GPS_CONFIG);
await MSP.promise(MSPCodes.MSP_STATUS);
load_html();
function load_html() {
$('#content').load("./tabs/gps.html", process_html);
}
MSP.send_message(MSPCodes.MSP_STATUS, false, false, load_html);
function set_online(){
$('#connect').hide();
$('#waiting').show();
@ -49,6 +58,122 @@ gps.initialize = function (callback) {
// To not flicker the divs while the fix is unstable
let gpsWasFixed = false;
// GPS Configuration
const features_e = $('.tab-gps .features');
FC.FEATURE_CONFIG.features.generateElements(features_e);
const checkUpdateGpsControls = () => $('.gpsSettings').toggle(FC.FEATURE_CONFIG.features.isEnabled('GPS'));
$('input.feature', features_e).on('change', function () {
const element = $(this);
FC.FEATURE_CONFIG.features.updateData(element);
updateTabList(FC.FEATURE_CONFIG.features);
if (element.attr('name') === 'GPS') {
checkUpdateGpsControls();
}
});
checkUpdateGpsControls();
// generate GPS
const gpsProtocols = [
'NMEA',
'UBLOX',
'MSP',
];
const gpsBaudRates = [
'115200',
'57600',
'38400',
'19200',
'9600',
];
const gpsSbas = [
i18n.getMessage('gpsSbasAutoDetect'),
i18n.getMessage('gpsSbasEuropeanEGNOS'),
i18n.getMessage('gpsSbasNorthAmericanWAAS'),
i18n.getMessage('gpsSbasJapaneseMSAS'),
i18n.getMessage('gpsSbasIndianGAGAN'),
];
if (semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43)) {
gpsSbas.push(i18n.getMessage('gpsSbasNone'));
}
const gpsProtocolElement = $('select.gps_protocol');
const gpsAutoBaudElement = $('input[name="gps_auto_baud"]');
const gpsAutoBaudGroup = $('.gps_auto_baud');
const gpsAutoConfigElement = $('input[name="gps_auto_config"]');
const gpsAutoConfigGroup = $('.gps_auto_config');
const gpsUbloxGalileoElement = $('input[name="gps_ublox_galileo"]');
const gpsUbloxGalileoGroup = $('.gps_ublox_galileo');
const gpsUbloxSbasElement = $('select.gps_ubx_sbas');
const gpsUbloxSbasGroup = $('.gps_ubx_sbas');
const gpsHomeOnceElement = $('input[name="gps_home_once"]');
const gpsBaudrateElement = $('select.gps_baudrate');
for (let protocolIndex = 0; protocolIndex < gpsProtocols.length; protocolIndex++) {
gpsProtocolElement.append(`<option value="${protocolIndex}">${gpsProtocols[protocolIndex]}</option>`);
}
gpsProtocolElement.change(function () {
FC.GPS_CONFIG.provider = parseInt($(this).val());
// Call this to enable or disable auto config elements depending on the protocol
gpsAutoConfigElement.change();
}).val(FC.GPS_CONFIG.provider).change();
gpsAutoBaudElement.prop('checked', FC.GPS_CONFIG.auto_baud === 1);
gpsAutoConfigElement.on('change', function () {
const checked = $(this).is(":checked");
const ubloxSelected = FC.GPS_CONFIG.provider === gpsProtocols.indexOf('UBLOX');
const mspSelected = FC.GPS_CONFIG.provider === gpsProtocols.indexOf('MSP');
const enableGalileoVisible = checked && ubloxSelected && semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43);
gpsUbloxGalileoGroup.toggle(enableGalileoVisible);
const enableSbasVisible = checked && ubloxSelected;
gpsUbloxSbasGroup.toggle(enableSbasVisible);
gpsAutoBaudGroup.toggle(ubloxSelected || mspSelected);
gpsAutoConfigGroup.toggle(ubloxSelected || mspSelected);
}).prop('checked', FC.GPS_CONFIG.auto_config === 1).trigger('change');
gpsUbloxGalileoElement.change(function() {
FC.GPS_CONFIG.ublox_use_galileo = $(this).is(':checked') ? 1 : 0;
}).prop('checked', FC.GPS_CONFIG.ublox_use_galileo > 0).change();
for (let sbasIndex = 0; sbasIndex < gpsSbas.length; sbasIndex++) {
gpsUbloxSbasElement.append(`<option value="${sbasIndex}">${gpsSbas[sbasIndex]}</option>`);
}
gpsUbloxSbasElement.change(function () {
FC.GPS_CONFIG.ublox_sbas = parseInt($(this).val());
}).val(FC.GPS_CONFIG.ublox_sbas);
$('.gps_home_once').toggle(semver.gte(FC.CONFIG.apiVersion, API_VERSION_1_43));
gpsHomeOnceElement.change(function() {
FC.GPS_CONFIG.home_point_once = $(this).is(':checked') ? 1 : 0;
}).prop('checked', FC.GPS_CONFIG.home_point_once > 0).change();
for (const baudRate of gpsBaudRates) {
gpsBaudrateElement.append(`<option value="${baudRate}">${baudRate}</option>`);
}
gpsBaudrateElement.prop("disabled", true);
gpsBaudrateElement.parent().hide();
// End GPS Configuration
function update_ui() {
const lat = FC.GPS_DATA.lat / 10000000;
const lon = FC.GPS_DATA.lon / 10000000;
@ -80,6 +205,7 @@ gps.initialize = function (callback) {
<td style="width: 53%;" i18n="gpsSignalStatusQly">${i18n.getMessage('gpsSignalStatusQly')}</td>
</tr>
`);
if (FC.GPS_DATA.chn.length <= 16) {
// Legacy code path: old BF firmware or old ublox module
for (let i = 0; i < FC.GPS_DATA.chn.length; i++) {
@ -155,11 +281,9 @@ gps.initialize = function (callback) {
message.action = 'nofix';
frame.contentWindow.postMessage(message, '*');
}
}else{
} else {
gpsWasFixed = false;
$('#connect').show();
$('#waiting').hide();
$('#loadmap').hide();
set_offline();
}
}
@ -216,9 +340,31 @@ gps.initialize = function (callback) {
frame.contentWindow.postMessage(message, '*');
});
$('a.save').on('click', function() {
// fill some data
FC.GPS_CONFIG.auto_baud = $('input[name="gps_auto_baud"]').is(':checked') ? 1 : 0;
FC.GPS_CONFIG.auto_config = $('input[name="gps_auto_config"]').is(':checked') ? 1 : 0;
async function saveConfiguration() {
await MSP.promise(MSPCodes.MSP_SET_FEATURE_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_FEATURE_CONFIG));
await MSP.promise(MSPCodes.MSP_SET_GPS_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_GPS_CONFIG));
await MSP.promise(MSPCodes.MSP_EEPROM_WRITE);
reboot();
}
function reboot() {
gui_log(i18n.getMessage('configurationEepromSaved'));
GUI.tab_switch_cleanup(function() {
MSP.send_message(MSPCodes.MSP_SET_REBOOT, false, false, reinitializeConnection);
});
}
saveConfiguration();
});
GUI.content_ready(callback);
}
};
gps.cleanup = function (callback) {

View File

@ -135,7 +135,7 @@
<th i18n="configurationFeatureName"></th>
</tr>
</thead>
<tbody class="features other" id="noline">
<tbody class="features gps other" id="noline">
<!-- table generated here -->
</tbody>
</table>
@ -143,82 +143,6 @@
</div>
</div>
<!-- END OTHER FUTURES-->
<!-- GPS -->
<div class="gps">
<div class="gui_box grey gps">
<div class="gui_box_titlebar">
<div class="spacer_box_title" i18n="configurationGPS"></div>
</div>
<div class="spacer_box">
<table class="featuresMultiple">
<thead>
<tr>
<th i18n="configurationFeatureEnabled"></th>
<th i18n="configurationFeatureDescription"></th>
<th i18n="configurationFeatureName"></th>
</tr>
</thead>
<tbody class="features gps">
<!-- table generated here -->
</tbody>
</table>
<div class="gpsSettings">
<div style="float:left; width:100%;">
<div class="note">
<p i18n="configurationGPSHelp"></p>
</div>
<div class="select line">
<select class="gps_protocol">
<!-- list generated here -->
</select>
<span i18n="configurationGPSProtocol"></span>
</div>
<div class="select line">
<select class="gps_baudrate">
<!-- list generated here -->
</select>
<span i18n="configurationGPSBaudrate"></span>
</div>
<div class="select gps_auto_baud">
<div>
<input type="checkbox" name="gps_auto_baud" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSAutoBaud"></span>
</div>
<div class="select gps_auto_config">
<div>
<input type="checkbox" name="gps_auto_config" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSAutoConfig"></span>
</div>
<div class="select gps_ublox_galileo">
<div>
<input type="checkbox" name="gps_ublox_galileo" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSGalileo"></span>
<div class="helpicon cf_tip" i18n_title="configurationGPSGalileoHelp"></div>
</div>
<div class="select gps_home_once">
<div>
<input type="checkbox" name="gps_home_once" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSHomeOnce"></span>
<div class="helpicon cf_tip" i18n_title="configurationGPSHomeOnceHelp"></div>
</div>
<div class="select line gps_ubx_sbas">
<select class="gps_ubx_sbas">
<!-- list generated here -->
</select>
<span i18n="configurationGPSubxSbas"></span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- END GPS-->
</div> <!-- END grid-col col6 -->
<div class="grid-col col6">
@ -416,10 +340,12 @@
</div>
</div>
</div>
<div class="content_toolbar">
<div class="btn save_btn">
<a class="save" href="#" i18n="configurationButtonSave"></a>
</div>
</div>
</div>
</div>

View File

@ -1,13 +1,83 @@
<div class="tab-gps">
<div class="tab-gps toolbar_fixed_bottom">
<div class="content_wrapper">
<div class="tab_title" i18n="tabGPS">GPS</div>
<div class="cf_doc_version_bt">
<a id="button-documentation" href="" target="_blank" rel="noopener noreferrer"></a>
</div>
<div class="grid-row">
<div class="grid-col col5">
<div class="gui_box grey gps">
<div class="gui_box_titlebar">
<div class="spacer_box_title" i18n="configurationGPS"></div>
</div>
<div class="spacer_box">
<div class="gps_config">
<div style="float:left; width:100%;">
<div class="select line">
<select class="gps_protocol">
<!-- list generated here -->
</select>
<span i18n="configurationGPSProtocol"></span>
</div>
<div class="select line">
<select class="gps_baudrate">
<!-- list generated here -->
</select>
<span i18n="configurationGPSBaudrate"></span>
</div>
<div class="select gps_auto_baud">
<div>
<input type="checkbox" name="gps_auto_baud" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSAutoBaud"></span>
</div>
<div class="select gps_auto_config">
<div>
<input type="checkbox" name="gps_auto_config" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSAutoConfig"></span>
</div>
<div class="select gps_ublox_galileo">
<div>
<input type="checkbox" name="gps_ublox_galileo" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSGalileo"></span>
<div class="helpicon cf_tip" i18n_title="configurationGPSGalileoHelp"></div>
</div>
<div class="select gps_home_once">
<div>
<input type="checkbox" name="gps_home_once" class="toggle" />
</div>
<span class="freelabel" i18n="configurationGPSHomeOnce"></span>
<div class="helpicon cf_tip" i18n_title="configurationGPSHomeOnceHelp"></div>
</div>
<div class="select line gps_ubx_sbas">
<select class="gps_ubx_sbas">
<!-- list generated here -->
</select>
<span i18n="configurationGPSubxSbas"></span>
</div>
</div>
</div>
</div>
</div>
<div class="gui_box grey">
<div class="gui_box_titlebar">
<div class="spacer_box_title" i18n="gpsSignalStrHead"></div>
</div>
<div class="spacer_box GPS_signal_strength">
<table class="cf_table">
<!-- Contents generated in gps.js -->
</table>
</div>
</div>
</div>
<div class="grid-col col7">
<div class="gui_box grey">
<div class="gui_box_titlebar">
<div class="spacer_box_title" i18n="gpsHead"></div>
@ -46,18 +116,6 @@
</div>
</div>
<div class="gui_box grey">
<div class="gui_box_titlebar">
<div class="spacer_box_title" i18n="gpsSignalStrHead"></div>
</div>
<div class="spacer_box GPS_signal_strength">
<table class="cf_table">
<!-- Contents generated in gps.js -->
</table>
</div>
</div>
</div>
<div class="grid-col col7">
<div class="gui_box grey gps_map">
<div class="gui_box_titlebar" style="margin-bottom: 0px;">
<div class="spacer_box_title" i18n="gpsMapHead"></div>
@ -65,9 +123,8 @@
<div id="connect" i18n="gpsMapMessage1">
<div class="default_btn" style="width:50px; margin-left:auto; margin-right:auto; float:none;"><a id="check">retry</a></div>
</div>
<div id="waiting" >
<div class="info" i18n="gpsMapMessage2">
</div>
<div id="waiting">
<div class="info" i18n="gpsMapMessage2"></div>
</div>
<div id="loadmap">
<webview id="map" class="map" src="tabs/map.html" partition="persist:map"></webview>
@ -76,9 +133,14 @@
<a href="#" id="zoom_out"></a>
</div>
</div>
</div>
</div>
</div>
<div class="content_toolbar">
<div class="btn save_btn">
<a class="save" href="#" i18n="configurationButtonSave"></a>
</div>
</div>
</div>
</div>
</div>