A GPS disciplined clock
Dependencies: net lpc1768 crypto clock web log
web-derived/nmea/web-nmea-script.js
- Committer:
- andrewboyson
- Date:
- 2019-04-28
- Revision:
- 55:a1bd0572c8b6
- Parent:
- http-derived/nmea/http-nmea-script.js@ 49:115a5e4fac0c
File content as of revision 55:a1bd0572c8b6:
'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 = ''; function hexToBit(iChar, iBit) { var value = parseInt(response.charAt(iChar), 16); value >>= iBit; return value & 1; } function parseSint32fromHex(value) { value = parseInt(value, 16); if (value > 0x7FFFFFFF) value -= 0xFFFFFFFF; return value; } function parseAjax() { 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)); buckets = ''; for (var i = 0; i < bucketCount; i++) { buckets += (i * 50).toString().padStart(3, '0') + ' ' + parseInt(response.substr(81 + i * 8, 8), 16) + '\r\n'; } } function degToString(plus, minus, deg) { deg /= NMEA_DEG_UNIT; if (deg >= 0) return plus + deg.toFixed(5); else return minus + (-deg).toFixed(5); } function hgtToString(plus, minus, hgt) { hgt /= NMEA_HGT_UNIT; if (hgt >= 0) return plus + hgt.toFixed(1); else return minus + (-hgt).toFixed(1); } 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', msgTrace ? 'rtl' : 'ltr'); elem = document.getElementById('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 = 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 = 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