A GPS disciplined clock
Dependencies: net lpc1768 crypto clock web log
Diff: web-this/nmea/web-nmea-script.js
- Revision:
- 60:7cab896b0fd4
- Parent:
- 59:d2d25c2265f8
diff -r d2d25c2265f8 -r 7cab896b0fd4 web-this/nmea/web-nmea-script.js --- a/web-this/nmea/web-nmea-script.js Wed May 01 10:14:26 2019 +0000 +++ b/web-this/nmea/web-nmea-script.js Wed May 01 14:08:56 2019 +0000 @@ -1,60 +1,58 @@ +//Nmea script 'use strict'; const NMEA_DEG_UNIT = 10000000; const NMEA_HGT_UNIT = 1000000; -var response = ''; -var headers = ''; -var gpsTrace = false; -var gpsVerbose = false; -var msgTrace = false; -var cmdTrace = false; -var lat = 0; -var lng = 0; -var hgt = 0; -var hgtAboveMsl = 0; -var mslAboveWgs = 0; -var dop = 0; -var satCount = 0; -var fixQuality = 0; -var sensorHeight = 0; -var bucketCount = 0; -var buckets = ''; +let gpsTrace = false; +let gpsVerbose = false; +let msgTrace = false; +let cmdTrace = false; +let lat = 0; +let lng = 0; +let hgt = 0; +let hgtAboveMsl = 0; +let mslAboveWgs = 0; +let dop = 0; +let satCount = 0; +let fixQuality = 0; +let sensorHeight = 0; +let bucketCount = 0; +let buckets = ''; -function hexToBit(iChar, iBit) -{ - var value = parseInt(response.charAt(iChar), 16); - value >>= iBit; - return value & 1; -} -function parseSint32fromHex(value) +function parseVariables(text) { - value = parseInt(value, 16); - if (value > 0x7FFFFFFF) value -= 0xFFFFFFFF; - return value; + let lines = text.split('\n'); + gpsTrace = Ajax.hexToBit (lines[0], 0); + gpsVerbose = Ajax.hexToBit (lines[0], 1); + msgTrace = Ajax.hexToBit (lines[0], 2); + cmdTrace = Ajax.hexToBit (lines[0], 3); + lat = Ajax.hexToSignedInt32(lines[1]); + lng = Ajax.hexToSignedInt32(lines[2]); + hgt = Ajax.hexToSignedInt32(lines[3]); + hgtAboveMsl = Ajax.hexToSignedInt32(lines[4]); + mslAboveWgs = Ajax.hexToSignedInt32(lines[5]); + dop = Ajax.hexToSignedInt32(lines[6]); + satCount = Ajax.hexToSignedInt32(lines[7]); + fixQuality = Ajax.hexToSignedInt32(lines[8]); + sensorHeight = Ajax.hexToSignedInt32(lines[9]); } -function parseAjax() +function parseBuckets(text) { - gpsTrace = hexToBit(0, 0); - gpsVerbose = hexToBit(0, 1); - msgTrace = hexToBit(0, 2); - cmdTrace = hexToBit(0, 3); - lat = parseSint32fromHex(response.substr( 1, 8)); - lng = parseSint32fromHex(response.substr( 9, 8)); - hgt = parseSint32fromHex(response.substr(17, 8)); - hgtAboveMsl = parseSint32fromHex(response.substr(25, 8)); - mslAboveWgs = parseSint32fromHex(response.substr(33, 8)); - dop = parseSint32fromHex(response.substr(41, 8)); - satCount = parseSint32fromHex(response.substr(49, 8)); - fixQuality = parseSint32fromHex(response.substr(57, 8)); - sensorHeight = parseSint32fromHex(response.substr(65, 8)); - bucketCount = parseSint32fromHex(response.substr(73, 8)); + let lines = text.split('\n'); + bucketCount = Ajax.hexToSignedInt32(lines[0]); buckets = ''; - for (var i = 0; i < bucketCount; i++) + for (let i = 0; i < bucketCount; i++) { - buckets += (i * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n'; + buckets += (i * 50).toString().padStart(3, '0') + ' ' + Ajax.hexToSignedInt32(lines[i + 1]) + '\r\n'; } } +function parse() +{ + let topics = Ajax.response.split('\f'); + parseVariables(topics[0]); + parseBuckets (topics[1]); +} function degToString(plus, minus, deg) { deg /= NMEA_DEG_UNIT; @@ -67,63 +65,31 @@ if (hgt >= 0) return plus + hgt.toFixed(1); else return minus + (-hgt).toFixed(1); } -function displayGeneral() +function display() { - var elem; - elem = document.getElementById('ajax-trace-gps' ); if (elem) elem.setAttribute('dir', gpsTrace ? 'rtl' : 'ltr'); - elem = document.getElementById('ajax-trace-verbose'); if (elem) elem.setAttribute('dir', gpsVerbose ? 'rtl' : 'ltr'); - elem = document.getElementById('ajax-trace-msg' ); if (elem) elem.setAttribute('dir', msgTrace ? 'rtl' : 'ltr'); - elem = document.getElementById('ajax-trace-cmd' ); if (elem) elem.setAttribute('dir', cmdTrace ? 'rtl' : 'ltr'); + let elem; + elem = Ajax.getElementOrNull('ajax-trace-gps' ); if (elem) elem.setAttribute('dir', gpsTrace ? 'rtl' : 'ltr'); + elem = Ajax.getElementOrNull('ajax-trace-verbose'); if (elem) elem.setAttribute('dir', gpsVerbose ? 'rtl' : 'ltr'); + elem = Ajax.getElementOrNull('ajax-trace-msg' ); if (elem) elem.setAttribute('dir', msgTrace ? 'rtl' : 'ltr'); + elem = Ajax.getElementOrNull('ajax-trace-cmd' ); if (elem) elem.setAttribute('dir', cmdTrace ? 'rtl' : 'ltr'); - elem = document.getElementById('ajax-position' ); if (elem) elem.textContent = degToString('N', 'S', lat) + ' ' + - degToString('E', 'W', lng) + ' ' + - hgtToString('H', 'D', hgt); - elem = document.getElementById('ajax-msl-above-wgs'); if (elem) elem.textContent = hgtToString('H', 'D', mslAboveWgs); - elem = document.getElementById('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl); - elem = document.getElementById('ajax-gnd-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl - sensorHeight * NMEA_HGT_UNIT); + elem = Ajax.getElementOrNull('ajax-position' ); if (elem) elem.textContent = degToString('N', 'S', lat) + ' ' + + degToString('E', 'W', lng) + ' ' + + hgtToString('H', 'D', hgt); + elem = Ajax.getElementOrNull('ajax-msl-above-wgs'); if (elem) elem.textContent = hgtToString('H', 'D', mslAboveWgs); + elem = Ajax.getElementOrNull('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl); + elem = Ajax.getElementOrNull('ajax-gnd-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', hgtAboveMsl - sensorHeight * NMEA_HGT_UNIT); - elem = document.getElementById('ajax-dop' ); if (elem) elem.textContent = dop / 100; - elem = document.getElementById('ajax-sat-count' ); if (elem) elem.textContent = satCount; - elem = document.getElementById('ajax-fix-quality' ); if (elem) elem.textContent = fixQuality; - - elem = document.getElementById('ajax-sensor-hgt' ); if (elem) elem.value = sensorHeight; + elem = Ajax.getElementOrNull('ajax-dop' ); if (elem) elem.textContent = dop / 100; + elem = Ajax.getElementOrNull('ajax-sat-count' ); if (elem) elem.textContent = satCount; + elem = Ajax.getElementOrNull('ajax-fix-quality' ); if (elem) elem.textContent = fixQuality; - elem = document.getElementById('ajax-bucket-count' ); if (elem) elem.textContent = bucketCount; - elem = document.getElementById('ajax-buckets' ); if (elem) elem.textContent = buckets; - - elem = document.getElementById('ajax-response' ); if (elem) elem.textContent = response; - elem = document.getElementById('ajax-headers' ); if (elem) elem.textContent = headers; + elem = Ajax.getElementOrNull('ajax-sensor-hgt' ); if (elem) elem.value = sensorHeight; + + elem = Ajax.getElementOrNull('ajax-bucket-count' ); if (elem) elem.textContent = bucketCount; + elem = Ajax.getElementOrNull('ajax-buckets' ); if (elem) elem.textContent = buckets; } -var ajax; -function AjaxRequest(request) //Used by this script and from HTML page -{ - ajax=new XMLHttpRequest(); - ajax.onreadystatechange=handleAjaxResponse; - if (request) ajax.open('GET', '/nmea-ajax' + '?' + request, true); - else ajax.open('GET', '/nmea-ajax' , true); - ajax.send(); -} -function requestAjax() //Used in this script -{ - AjaxRequest(''); -} - -function handleAjaxResponse() -{ - if (ajax.readyState==4 && ajax.status==200) - { - response = ajax.responseText; - headers = ajax.getAllResponseHeaders(); - parseAjax(); - displayGeneral(); - } -} - -function init() -{ - setInterval(requestAjax, 10000); - requestAjax(); -} -if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init ); // Loading hasn't finished yet -else init(); //`DOMContentLoaded` has already fired +Ajax.server = '/nmea-ajax'; +Ajax.onResponse = function() { parse(); display(); }; +Ajax.init(); \ No newline at end of file