A GPS disciplined clock
Dependencies: net lpc1768 crypto clock web log
Diff: http-derived/nmea/http-nmea-script.js
- Revision:
- 48:9f1ab7784067
- Child:
- 49:115a5e4fac0c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/http-derived/nmea/http-nmea-script.js Wed Mar 27 18:40:21 2019 +0000 @@ -0,0 +1,116 @@ +'use strict'; + +var response = ''; +var headers = ''; +var gpsTrace = false; //nibble 0 : bit 0 +var gpsVerbose = false; //nibble 0 : bit 1 +var nmeaMsgTrace = false; //nibble 0 : bit 2 +var nmeaCmdTrace = false; //nibble 0 : bit 3 +var nmeaLat = 0; //nibble 1 +var nmeaLng = 0; //nibble 9 +var nmeaHgt = 0; //nibble 17 +var nmeaHgtAboveMsl = 0; //nibble 25 +var nmeaDop = 0; //nibble 33 +var nmeaSatCount = 0; //nibble 41 +var nmeaFixQuality = 0; //nibble 49 +var sensorheight = 0; //nibble 57 +var bucketCount = 0; //nibble 65 +var buckets = ''; //nibble 73 + +function hexToBit(iChar, iBit) +{ + var value = parseInt(response.charAt(iChar), 16); + value >>= iBit; + return value & 1; +} +function parseAjax() +{ + gpsTrace = hexToBit(0, 0); + gpsVerbose = hexToBit(0, 1); + nmeaMsgTrace = hexToBit(0, 2); + nmeaCmdTrace = hexToBit(0, 3); + nmeaLat = parseInt(response.substr( 1, 8), 16); + nmeaLng = parseInt(response.substr( 9, 8), 16); + nmeaHgt = parseInt(response.substr(17, 8), 16); + nmeaHgtAboveMsl = parseInt(response.substr(25, 8), 16); + nmeaDop = parseInt(response.substr(33, 8), 16); + nmeaSatCount = parseInt(response.substr(41, 8), 16); + nmeaFixQuality = parseInt(response.substr(49, 8), 16); + sensorheight = parseInt(response.substr(57, 8), 16); + bucketCount = parseInt(response.substr(65, 8), 16); + for(var i = 0; i < bucketCount; i++) + { + buckets += i.padStart(2, '0') + ' ' + parseInt(response.substr(73 + i * 8, 8), 16) + '\r\n'; + } +} +function degToString(plus, minus, deg) +{ + deg /= 10000000; + if (deg >= 0) return plus + deg.toFixed(5); + else return minus + (-deg).toFixed(5); +} +function hgtToString(plus, minus, hgt) +{ + hgt /= 1000000; + if (hgt >= 0) return plus + hgt.toFixed(5); + else return minus + (-hgt).toFixed(5); +} +function displayGeneral() +{ + 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', nmeaMsgTrace ? 'rtl' : 'ltr'); + elem = document.getElementById('ajax-trace-cmd' ); if (elem) elem.setAttribute('dir', nmeaCmdTrace ? 'rtl' : 'ltr'); + + elem = document.getElementById('ajax-position' ); if (elem) elem.textContent = degToString('N', 'S', nmeaLat) + ' ' + + degToString('E', 'W', nmeaLng) + ' ' + + hgtToString('H', 'D', nmeaHgt); + elem = document.getElementById('ajax-hgt-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', nmeaHgtAboveMsl); + elem = document.getElementById('ajax-gnd-above-msl'); if (elem) elem.textContent = hgtToString('H', 'D', nmeaHgtAboveMslAv - sensorHeight * NMEA_HGT_UNIT); + + elem = document.getElementById('ajax-dop' ); if (elem) elem.textContent = nmeaDop / 100; + elem = document.getElementById('ajax-sat-count' ); if (elem) elem.textContent = nmeaSatCount; + elem = document.getElementById('ajax-fix-quality' ); if (elem) elem.textContent = nmeaFixQuality; + + elem = document.getElementById('ajax-sensor-hgt' ); if (elem) elem.value = sensorheight; + + 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; +} + +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