A GPS disciplined clock
Dependencies: net lpc1768 crypto clock web log
http-derived/nmea/http-nmea-script.js
- Committer:
- andrewboyson
- Date:
- 2019-03-27
- Revision:
- 48:9f1ab7784067
- Child:
- 49:115a5e4fac0c
File content as of revision 48:9f1ab7784067:
'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