'use strict'; TABS.gps = {}; TABS.gps.initialize = function (callback) { if (GUI.active_tab !== 'gps') { GUI.active_tab = 'gps'; } 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(); $('#loadmap').hide(); } function set_offline(){ $('#connect').show(); $('#waiting').hide(); $('#loadmap').hide(); } function process_html() { // translate to user-selected languageconsole.log('Online'); i18n.localizePage(); function get_raw_gps_data() { MSP.send_message(MSPCodes.MSP_RAW_GPS, false, false, get_comp_gps_data); } function get_comp_gps_data() { MSP.send_message(MSPCodes.MSP_COMP_GPS, false, false, get_gpsvinfo_data); } function get_gpsvinfo_data() { MSP.send_message(MSPCodes.MSP_GPS_SV_INFO, false, false, update_ui); } // To not flicker the divs while the fix is unstable let gpsWasFixed = false; function update_ui() { const lat = FC.GPS_DATA.lat / 10000000; const lon = FC.GPS_DATA.lon / 10000000; const url = `https://maps.google.com/?q=${lat},${lon}`; const gnssArray = ['GPS', 'SBAS', 'Galileo', 'BeiDou', 'IMES', 'QZSS', 'Glonass']; const qualityArray = ['gnssQualityNoSignal', 'gnssQualitySearching', 'gnssQualityAcquired', 'gnssQualityUnusable', 'gnssQualityLocked', 'gnssQualityFullyLocked', 'gnssQualityFullyLocked', 'gnssQualityFullyLocked']; const usedArray = ['gnssUsedUnused', 'gnssUsedUsed']; const healthyArray = ['gnssHealthyUnknown', 'gnssHealthyHealthy', 'gnssHealthyUnhealthy', 'gnssHealthyUnknown']; let alt = FC.GPS_DATA.alt; if (semver.lt(FC.CONFIG.apiVersion, API_VERSION_1_39)) { alt = alt / 10; } $('.GPS_info td.fix').html((FC.GPS_DATA.fix) ? i18n.getMessage('gpsFixTrue') : i18n.getMessage('gpsFixFalse')); $('.GPS_info td.alt').text(`${alt} m`); $('.GPS_info td.lat a').prop('href', url).text(`${lat.toFixed(4)} deg`); $('.GPS_info td.lon a').prop('href', url).text(`${lon.toFixed(4)} deg`); $('.GPS_info td.speed').text(`${FC.GPS_DATA.speed} cm/s`); $('.GPS_info td.sats').text(FC.GPS_DATA.numSat); $('.GPS_info td.distToHome').text(`${FC.GPS_DATA.distanceToHome} m`); // Update GPS Signal Strengths const eSsTable = $('div.GPS_signal_strength table'); eSsTable.html(''); eSsTable.append(` ${i18n.getMessage('gpsSignalGnssId')} ${i18n.getMessage('gpsSignalSatId')} ${i18n.getMessage('gpsSignalStr')} ${i18n.getMessage('gpsSignalStatusQly')} `); 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++) { eSsTable.append(` - ${FC.GPS_DATA.svid[i]} ${FC.GPS_DATA.quality[i]} `); } // Cleanup the rest of the table for (let i = FC.GPS_DATA.chn.length; i < 32; i++) { eSsTable.append(` - - `); } } else { // M8N/M9N on newer firmware const maxUIChannels = 32; //the list in html can only show 32 channels but future firmware could send more let channels = Math.min(maxUIChannels, FC.GPS_DATA.chn.length) || 32; for (let i = 0; i < channels; i++) { let rowContent = ''; if (FC.GPS_DATA.chn[i] <= 6) { rowContent += `${gnssArray[FC.GPS_DATA.chn[i]]}`; } else { rowContent += '-'; } if (FC.GPS_DATA.chn[i] >= 7) { rowContent += '-'; rowContent += ``; rowContent += ` `; } else { rowContent += `${FC.GPS_DATA.svid[i]}`; rowContent += ``; const quality = i18n.getMessage(qualityArray[FC.GPS_DATA.quality[i] & 0x7]); const used = i18n.getMessage(usedArray[(FC.GPS_DATA.quality[i] & 0x8) >> 3]); const healthy = i18n.getMessage(healthyArray[(FC.GPS_DATA.quality[i] & 0x30) >> 4]); rowContent += `${quality} | ${used} | ${healthy}`; } eSsTable.append(`${rowContent}`); } } const message = { action: 'center', lat: lat, lon: lon, }; frame = document.getElementById('map'); if (navigator.onLine) { $('#connect').hide(); if (FC.GPS_DATA.fix) { gpsWasFixed = true; frame.contentWindow.postMessage(message, '*'); $('#loadmap').show(); $('#waiting').hide(); } else if (!gpsWasFixed) { $('#loadmap').hide(); $('#waiting').show(); } else { message.action = 'nofix'; frame.contentWindow.postMessage(message, '*'); } }else{ gpsWasFixed = false; $('#connect').show(); $('#waiting').hide(); $('#loadmap').hide(); } } let frame = document.getElementById('map'); // enable data pulling GUI.interval_add('gps_pull', function gps_update() { // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. if (!have_sensor(FC.CONFIG.activeSensors, 'gps')) { //return; } get_raw_gps_data(); }, 75, true); // status data pulled via separate timer with static speed GUI.interval_add('status_pull', function status_pull() { MSP.send_message(MSPCodes.MSP_STATUS); }, 250, true); //check for internet connection on load if (navigator.onLine) { console.log('Online'); set_online(); } else { console.log('Offline'); set_offline(); } $("#check").on('click',function(){ if (navigator.onLine) { console.log('Online'); set_online(); } else { console.log('Offline'); set_offline(); } }); $('#zoom_in').click(function() { console.log('zoom in'); const message = { action: 'zoom_in', }; frame.contentWindow.postMessage(message, '*'); }); $('#zoom_out').click(function() { console.log('zoom out'); const message = { action: 'zoom_out', }; frame.contentWindow.postMessage(message, '*'); }); GUI.content_ready(callback); } }; TABS.gps.cleanup = function (callback) { if (callback) callback(); };